C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构。
STL中六大组件:
1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
2)迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。
3)算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。
4)仿函数(Function object)
5)迭代适配器(Adaptor)
6)空间配制器(allocator)
其中容器(管理某类对象的集合),迭代器(在对象集合上进行遍历),算法(处理集合内的元素)是三个主要组件。协作关系如下
容器
(1)序列式容器,每个元素都有固定位置--取决于插入时机和地点,和元素值无关,vector、deque、list;
(2)关联式容器,元素位置取决于特定的排序准则,和插入顺序无关,set、multiset、map、multimap;
Sets/Multisets:内部的元素依据其值自动排序,Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素,内部由二叉树实现,便于查找;
下面是对vector容器的应用:
//1.定义和初始化
vector<int> vec1; //默认初始化,vec1为空
vector<int> vec2(vec1); //使用vec1初始化vec2
vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
vector<int> vec4(10); //10个值为的元素
vector<int> vec5(10,4); //10个值为的元素
//2.常用操作方法
vec1.push_back(100); //添加元素
int size = vec1.size(); //元素个数
bool isEmpty = vec1.empty(); //判断是否为空
cout<<vec1[0]<<endl; //取得第一个元素
vec1.insert(vec1.end(),5,3); //从vec1.back位置插入个值为的元素
vec1.pop_back(); //删除末尾元素
vec1.erase(vec1.begin(),vec1.end());//删除之间的元素,其他元素前移
cout<<(vec1==vec2)?true:false; //判断是否相等==、!=、>=、<=...
vector<int>::iterator iter = vec1.begin(); //获取迭代器首地址
vec1.clear(); //清空元素
迭代器(iterator):
1.可遍历STL容器内全部或部分元素的对象
2.指出容器中的一个特定位置
vector迭代器相关函数:
1. begin()返回一个迭代器,指向第一个元素;
2. end()返回一个迭代器,指向最后一个元素末尾;
3. rbegin()返回一个逆向迭代器,指向逆向遍历的第一个元素;
4. rend()返回一个逆向迭代器,指向逆向遍历的最后一个元素;
迭代器持续有效,除非发生以下两种情况:
1.删除或插入元素
2.容量变化而引起内存重新分配
STL算法库包含了许多好用的函数,可以直接调用,主要头文件有
<algorithm>,<numeric>和<functional>
学习小结:熟悉了STL之后,许多代码可以被大大的化简,利用vector可以高效随机访问、节省空间,利用map我们实现了数组下标的取用不只局限于整形数据。并且STL中包含了许多好用的函数,要让STL成为自己的一项基本技能。