C++黑马程序员——P185-188. STL初识

发布时间 2023-04-20 15:36:12作者: 我会变强的
  • P185. STL初识——STL的基本概念
  • P186. STL初识——vector存放内置数据类型
  • P187. STL初识——vector存放自定义数据类型
  • P188. STL初识——容器嵌套容器
  • P185. STL的基本概念

STL,Standard Template Library,标准模板库

STL:为了提高代码的复用性,提供一套标准的数据结构和算法

STL从广义上分为:容器(container),算法(algorithm),迭代器(iterator)

容器算法之间通过迭代器进行无缝连接

  

容器:

  

算法:

  

迭代器:

  

 

  

 

  • P186. vector存放内置数据类型

此节主要内容:

  

先看个例子:

 1 #include <iostream>
 2 using namespace std;
 3 #include <vector>
 4 
 5 //vector容器存放内置数据类型
 6 void test01()
 7 {
 8     //创建了一个vector容器(先理解为一个数组)
 9     vector<int>v;  //int为数据类型,v为容器变量名
10     //向容器中插入数据
11     v.push_back(10);  //push_back 尾插
12     v.push_back(20);
13     v.push_back(30);
14     v.push_back(40);
15     //通过迭代器访问容器中的数据
16     //迭代器暂时理解为指针
17     vector<int>::iterator itBegin = v.begin();    //起始迭代器 指向容器中第一个元素
18     vector<int>::iterator itEnd = v.end();    //结束迭代器 指向容器中最后一个元素的下一个位置
19     while (itBegin != itEnd)
20     {
21         cout << *itBegin << endl;
22         itBegin++;
23     }
24 }
25 
26 int main()
27 {
28     test01();
29     return 0;
30 }

运行结果:

  

 

第二种遍历方式:

1     //第二种遍历方式
2     for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
3     {
4         cout << *it << endl;
5     }

运行结果 同上

 

第三种遍历方式:

 1 ...
 2 #include <algorithm>
 3 
 4 void MyPrint(int val)
 5 {
 6     cout << val << endl;
 7 }
 8 
 9 //vector容器存放内置数据类型
10 void test01()
11 {
12     //创建了一个vector容器(先理解为一个数组)
13     vector<int>v;
14     //向容器中插入数据
15     v.push_back(10);
16     v.push_back(20);
17     v.push_back(30);
18     v.push_back(40);
19 
20     //第三种遍历方式
21     for_each(v.begin(), v.end(), MyPrint);
22 }
23 ...

运行结果 同上

for_each模板中的关键部分:

1 for (; _UFirst != _ULast; ++_UFirst) {
2         _Func(*_UFirst);
3     } 

for_each(v.begin(), v.end(), MyPrint); 就是当v.begin() != v.end(),就执行MyPrint(*v.begin()),并且v.begin()++;

 

  • P187. vector存放自定义数据类型

此节主要内容:vector中存放自定义数据类型,并打印输出

 1 #include <iostream>
 2 using namespace std;
 3 #include <vector>
 4 #include <string>
 5 
 6 //vector中存放自定义数据类型
 7 class Person
 8 {
 9 public:
10     Person(string name, int age)
11     {
12         this->m_Name = name;
13         this->m_Age = age;
14     }
15     string m_Name;
16     int m_Age;
17 };
18 
19 void test01()
20 {
21     //创建一个Person的容器
22     vector<Person>v;
23 
24     Person p1("aaa", 10);
25     Person p2("bbb", 20);
26     Person p3("ccc", 30);
27     Person p4("ddd", 40);
28     Person p5("eee", 50);
29 
30     //向容器中添加数据
31  v.push_back(p1);
32     v.push_back(p2);
33     v.push_back(p3);
34     v.push_back(p4);
35     v.push_back(p5);
36 
37     //遍历容器中的数据
38     for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
39     {
40         cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << endl;
41         //或者
42         //cout << it->m_Name << "\t" << it->m_Age << endl;  //it可以看成Person的指针
43     }
44 
45 }
46 
47 //存放自定义数据类型 指针
48 void test02()
49 {
50     vector<Person*>v;
51 
52     Person p1("aaa", 10);
53     Person p2("bbb", 20);
54     Person p3("ccc", 30);
55     Person p4("ddd", 40);
56     Person p5("eee", 50);
57 
58     //向容器中添加数据
59     v.push_back(&p1);    //&取址
60     v.push_back(&p2);
61     v.push_back(&p3);
62     v.push_back(&p4);
63     v.push_back(&p5);
64 
65     //遍历容器中的数据
66     for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++)
67     {
68         cout << "02姓名:" << (**it).m_Name << " 年龄:" << (**it).m_Age << endl;  //两次解引用
69         //或者
70         //cout << (*it)->m_Name << "\t" << (*it)->m_Age << endl;  //it相当于Person*的指针,(*it)(解引用)相当于Person*(简单来说,就是看vector后的“<>”中的内容)
71     }
72 }
73 
74 int main()
75 {
76     test01();
77     test02();
78     return 0;
79 }

运行结果:

  

 

  • P188. 容器嵌套容器

此节主要内容:容器中嵌套容器,将所有数据进行遍历输出

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 //容器嵌套容器
 6 void test01()
 7 {
 8     vector<vector<int>>v;
 9     //创建小容器
10     vector<int>v1;
11     vector<int>v2;
12     vector<int>v3;
13     vector<int>v4;
14     //向小容器中添加数据
15     for (int i = 0; i < 4; i++)
16     {
17         v1.push_back(i + 1);
18         v2.push_back(i + 2);
19         v3.push_back(i + 3);
20         v4.push_back(i + 4);
21     }
22     //将小容器插入到大容器中
23     v.push_back(v1);
24     v.push_back(v2);
25     v.push_back(v3);
26     v.push_back(v4);
27 
28     //通过大容器,把所有数据遍历一遍
29     for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
30     {
31         //(*it)——vector<int>
32         for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
33         {
34             cout << *vit << " ";
35         }
36         cout << endl;
37     }
38 }
39 
40 int main() {
41     
42     test01();
43     return 0;
44 }

运行结果:

  

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)