Standard Template Library,标准模板库
STL从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。
STL几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。
1.三大组件
1.容器
根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种。
- 序列式容器强调值的排序,包含Vector容器、Deque容器、List容器等。
- 关联式容器是非线性的树结构,在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,包含Set/multiset容器 Map/multimap容器
2.算法
STL收录的算法包括常用的排序,查找等等,分为质变算法和非质变算法。
- 质变算法:会更改区间内的元素的内容。例如拷贝,替换,删除等等
- 非质变算法:不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等
3.迭代器
依序寻访某个容器所含的各个元素,包含输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机访问迭代器.
2.容器
1.操作流程
- 引入头文件:
#include <vector>
- 声明容器
//声明一个容器,在这个容器中存放int类型数据,容器的名称为v
vector<int> v;
- 想容器中加入数据
//向容器中加入数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
- 利用迭代器遍历容器中的数据,每个容器有专属的迭代器
vector<int>::iterator itBegin =v.begin();
vector<int>::iterator itEnd =v.end();
while(itBegin!=itEnd){
cout<<*itBegin<<endl;
itBegin++;
}
2.容器嵌套容器
重点在于vector< int >::iterator it2= (* it1).begin();
for(vector<vector<int>>::iterator it1=v.begin();it1!=v.end();it1++){
for ( vector<int>::iterator it2= (*it1).begin(); it2!=(*it1).end() ; it2++) {
cout<<*it2<<endl;
}}
4. 容器迭代器
v.capacity()
:容器的容量,会给出一些多余的空间- vector迭代器所需要的操作行为有operaroe*, operator->, operator++, operator–, operator+, operator-, operator+=, operator-=等.
- Vector支持随机存取,提供的是随机访问迭代器(Random Access Iterators).
5.基本方法
(1)大小操作
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
(2)存取操作
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
(3)插入和删除
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
push_back(ele); //尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素
6.对vector内存空间的操作
(1)利用swap收缩内存空间
v.resize(10); //size更改为10
vector<int>(v).swap(v); //capacity更改为10
(2)利用reserve预留空间
v.reserve(100000);
3.算法
- 引入头文件:
#include <algorithm>
4.迭代器
1.容器的迭代器
1.示例
- 引入头文件:
#include <iterator>
- 普通指针也是一种迭代器!
int array[5]={ 1, 3, 5, 7, 9 };
int *p=array;//指针指向数组的首地址 &array(0)
for(int i=0;i<5;i++){
cout<<*(p++)<<endl; //*(p++):迭代输出
}
- 声明迭代器
//vector<int>这种容器的作用域下的迭代器,名称为it
vector<int>::iterator itBegin =v.begin(); //指向v容器中的起始位置
vector<int>::iterator itEnd =v.end(); //指向v容器中的最后一个位置的下一个地址
- 遍历方式
(1)while循环
while(itBegin!=itEnd){
cout<<*itBegin<<endl; //用指针得到对象
itBegin++;
}
(2)for循环,可以一行代码搞定
for(vector<int>::iterator it=v.begin();it!=v.end();i++){
cout<<*it<<endl;
}
(3)利用foreach算法
① 定义打印方法
void myPrint(int v){
cout<<v<<endl;
}
②for_each(v.begin(),v.end(),myPrint);