摘要:本文主要介绍了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 }