STL即标准模板库,是指设计好的一系列对通用数据结构进行类模板和函数模板
在标准类模板库中,所有提供数据常用处理功能的函数模板成为算法
在标准模板库中,所有描述数据结构的类模板称为容器类,容器就是用来存放不同类型数据的数据结构,容器也经常指容器类。
标准模板库STL中对容器的使用设计以下几个方面:
(1)容器:保存数据的类模板的实列对象
(2)迭代器:容器中元素的指针
(3)适配器:容器类派生出的有其他数据结构特点的类模板的实列对象。
(4)算法:作用于容器上的处理函数的函数模板。
STL容器与迭代器
容器是用于保存数据且存取数据方便,高效的对象。容器分为顺序容器和关联容器
(1)顺序容器:容器中的数据有先后顺序。顺序容器有vector,list,deque
(2)关联容器:容器中的数据没有先后顺序。关联容器有set,map等2
顺序容器的特点:
vector 内部用连续的存储空间实现,可以快速存取,但插入、删除比较慢(都需要移动元素);
list 内部用双向链表实现,可快速插入和删除(只需要修改指针),但是存取速度较慢(从头遍历)。
deque 内部分块链接,局部是数组,存取,插入和删除介于vector和list之间;
迭代器:容器中类似与元素指针的量来操作容器元素,迭代器有正向迭代器也有逆向迭代器
获取头尾迭代器的操作:
c.begin()//指向容器c的头元素的迭代器值
c.end() //指向容器c的末尾元素最后一位置的迭代器值
c.rbegin()//指向容器c的末尾元素的迭代器值
c.rend() //指向容器c的头元素前一个位置迭代器值
迭代器p可以使用p++,++p,p--,--p,p+3,p-2,p+=3,p-=2
顺序的容器的常用操作:
操作 |
作用 | 可操作容器 |
c.push_back(x) | 将x添加到容器末尾 | 全部 |
c.push_front(x) | 将x添加到容器头 | list,deque |
c.insert(p,x) | 将x插入迭代器p之前 | 全部,禁用逆向迭代器 |
c.erase(p) | 删除迭代器p指向的元素 | 全部,禁用逆向迭代器 |
c.erase(b,e) | 删除迭代器b到e之间的元素 | 全部,禁用逆向迭代器 |
c.clear() | 删除容器所有元素 | 全部 |
c.pop_back() | 删除容器末尾的元素 | 全部 |
c.pop_front() | 删除容器的头元素的引用 | list,deque |
c.back() | 返回容器末尾元素的引用 | 全部 |
c.front() | 返回容器头元素的引用 | 全部 |
c[n] | 返回下标n号元素的个数 | vector,deque |
c.size() | 返回容器元素的个数 | 全部 |
c.max_size() | 返回容器最大可能容量 | 全部 |
关联容器:
关
联容器有map(映射),set(集合),multimap(多重映射),multiset(多重集合)
STL算法:
STL中的算法是指常用的作用于各类容器数据的函数模板,算法通过迭代器对容器中的数据进行操作。
find(b,e,x) 在迭代器b,e之间的元素中查找X,若查找成功返回迭代器,若失败返回e | |
fill(b,e,x) 将迭代器b到e之间值替换为x | |
replace(b,e,x,y)将迭代器b,e之间的x替换为y | |
sort(b,e)将迭代器之间的元素按照升序排序 | |
sort(b,e,f)将迭代器b,到e之间的元素按照函数对象f定义的次序排列 | |
for_each(b,e,f)遍历迭代器b到e之间的元素,按照f定义的操作处理 | |