摘要:本文主要介绍了STL中三大组件——容器、迭代器和算法的基本使用。
1、容器
1.1 STL中容器的研究内容
STL容器实际上研究的是常见的数据结构的实现。
注意:数据结构存在的意义就是提供一种数据的特定排列方式,以方便算法的实现。
1.2 常用的数据结构(容器)以及分类
数组(array),链表(list),tree(树),栈(stack),队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种:
- 序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。例如:Vector容器、Deque容器、List容器等。
- 关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,方便查找。例如:Set/multiset容器 Map/multimap容器。
2、算法
2.1 算法的概念
以有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms).
2.2 算法的分类
算法分为:质变算法和非质变算法。
- 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
- 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等
3、迭代器
3.1 迭代器的概念以及作用
- 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。
- 迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。
3.2 迭代器的种类
|
输入迭代器 |
提供对数据的只读访问 |
只读,支持++、==、!= |
|
输出迭代器 |
提供对数据的只写访问 |
只写,支持++ |
|
前向迭代器 |
提供读写操作,并能向前推进迭代器 |
读写,支持++、==、!= |
|
双向迭代器 |
提供读写操作,并能向前和向后操作 |
读写,支持++、--, |
|
随机访问迭代器 |
提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器 |
读写,支持++、--、[n]、-n、<、<=、>、>= |
4、三大组件的基本使用举例
重点关注以下内容:
4.1 vector容器的定义的方法;
4.2 迭代器的定义和使用;
4.3 迭代器定义的数据可以当做指针使用,明确其意义;
4.3 遍历算法的简单使用
1 #include <iostream>
2 #include <string>
3 #include<vector>
4 #include <algorithm> //算法头文件
5
6 using namespace std;
7
8 void myPrint(int v) //为算法显示提供方法
9 {
10 cout << v << endl;
11 }
12
13 //用容器操作int型数据
14 void test01() {
15 vector<int>v; //定义一个名字为v的容器,存放int数据
16
17 v.push_back(10);
18 v.push_back(20);
19 v.push_back(30);
20 v.push_back(40);
21 v.push_back(50);
22
23 //用迭代器进行遍历
24 for (vector<int>::iterator it=v.begin();it!=v.end();it++)
25 {
26 cout << *it << endl;
27 }
28 //利用算法进行遍历
29 for_each(v.begin(),v.end(),myPrint);
30 }
31
32 //用容器操作自定义的数据类型
33 class Person { //首先定义person类
34 public:
35 Person(string name,int age) {
36 this->m_age = age;
37 this->m_name = name;
38 }
39 string m_name;
40 int m_age;
41 };
42
43 void test02() { //容器内存放的是指针类型
44 vector<Person*>v;
45 Person p1("小明",18);
46 Person p2("小红",17);
47 Person p3("李明",20);
48
49 v.push_back(&p1);
50 v.push_back(&p2);
51 v.push_back(&p3);
52
53 for (vector<Person*>::iterator it=v.begin();it!=v.end();it++)
54 {
55 cout << "姓名: " << (*it)->m_name << "年龄: " << (*it)->m_age << endl;
56 } //这里的it实际上是二级指针
57 }
58 void test03() { //容器内存放的是自定义对象类型
59 vector<Person>v;
60 Person p1("小明", 18);
61 Person p2("小红", 17);
62 Person p3("李明", 20);
63
64 v.push_back(p1);
65 v.push_back(p2);
66 v.push_back(p3);
67
68 for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
69 {
70 cout << "姓名: " << it->m_name << "年龄: " << (*it).m_age << endl;
71 }//这里可以看书迭代器定义的可以按照指针来理解
72 }
73 //容器嵌套容器
74 void test04() {
75 vector<vector<int>>v;
76
77 vector<int>v1;//定义大容器中的内容
78 vector<int>v2;
79 vector<int>v3;
80
81 for (int i=0;i<5;i++) //将int数据放到各个小容器中
82 {
83 v1.push_back(i);
84 v2.push_back(i+6);
85 v3.push_back(i+8);
86 }
87
88 v.push_back(v1); //将各个定义好的小容器放到大容器中
89 v.push_back(v2);
90 v.push_back(v3);
91
92 //遍历所有数据
93 for (vector<vector<int>>::iterator it=v.begin();it!=v.end();it++)
94 {
95 for (vector<int>::iterator itv=it->begin();itv!=it->end();itv++)
96 {
97 cout << *itv << " ";
98 }
99 cout << endl;
100 }
101 }
102 int main() {
103 //test01();
104 //test02();
105 //test03();
106 test04();
107 system("pause");
108 return 0;
109 }