标准模板库
一.STL的主要内容
1.容器:存储和管理数据的集合。
2.泛型算法:以一种泛型的方式去处理容器中的元素。
3.迭代器:在不曝露容器内部表示的前提下,以一种统一且透明的方式访问其中的元素。
二.STL的主要容器(十种)
1.线性容器
1)向量(vector)
2)列表(list)
3)双端队列(deque)
2.适配器容器
1)堆栈(stack)
2)队列(queue)
3)优先队列(priority_queue)
3.关联容器
1)映射(map)
2)集合(set)
3)多重映射(multimap)
4)多重集合(multiset)
三.向量
1.基本特性
1)连续内存,下标访问
2)动态内存管理
3)预分配内存
4)在随机位置做插入和删除,但是效率不高
2.实例化
#include <vector>
vector<元素类型> 向量类型;
vector<int> vi; // 空向量
vector<元素类型> 向量对象(初始大小);
vector<int> vi(5); // 带预分配内存的向量
基本类型元素:初始化为0
类类型元素:用缺省构造函数初始化
vector<元素类型> 向量对象(初始大小,初值);
vector<int> vi(5,12); // 带预分配内存且用指定值初始化的向量
vector<Student> vs(5,Student("张飞",20)); // 用匿名对象做初始值
vector<元素类型> 向量对象(起始迭代器,终止迭代器);
int a[5]={12,13,9,11,20};
vector<int> vi(a,a+5);// 终止迭代器是指数组元素的最后一个元素的下一个地址
3.向量的迭代器
1)随即迭代器:可以和整数做加减运算(+/-/+=/-=),可以在同类型的迭代器之间做大小比较和相减运算。
只有内存连续的容器(vector deque)才会支持随即迭代器,所有内存不连续的容器都只支持顺序迭代器
2)四个基本迭代器
iterator--- 正向迭代器
const_iterator 常正向迭代器,目标只读,相当于常指针
reverse_iterator 反向迭代器,增加向首,减少向尾
rbegin-> 指向最后一个元素
rend-> 指向第一个元素的前面一个位置
const_reverse_iterator 常反向迭代器
3)任何导致容器结构发生变化的操作,比如增删元素等,先前初始化的迭代器都可能因为这写操作而失效,因此保险期间,最好在做过这些操作以后重新初始化一下迭代器
4.常用成员函数
value_type&front(void):获取首元素
value_type const& front(void) const;
void push_back(value_type const& val) ; 后端压入元素
void pop_back(void); 获取尾元素
value_type& back(void);
value_type const& back(void)const;
iterator insert(iterator loc,value_type const& val); 在指定位置的前面插入数据,返回新插入元素的迭代器
iterator erase(iterator loc); // 删除指定元素
iterator begin(void); 正向起始迭代器
const_iterator begin(void)const;
iterator end(void);
const_iterator end(void)const;
reverse_iterator rbegin(void); 反向起始迭代器
const_iterator rbegin(void)const;
reverse_iterator rend(void);
const_iterator rend(void)const;
5.大小和容量
大小:实际容纳的元素个数
容量:最多容纳的元素个数 ,容量是以2的指数的方式倍增的,
class Student
{
char name[1024];
char home[1024];
};
class Student
{
class Student(...):name(new char[1024]),home(new char[1024]){ }
~Student(void)
{
delete name;
delete home;
}
char* name[1024];
char* home[1024];
};
vector<Student>vs;
6.查找和排序
#include <algorithm>
iterator find(iterator begin,iterator end,value_type const& key);
返回[begin,end)区间内第一个与key匹配的元素的迭代器,如果查找失败,则返回end.
void sort(iterator begin,iterator end); // 快速排序
四.双端队列(deque)
deque相对于vector就是增加了两个成员函数:push_front/pop_front,同时去掉了两个成员函数:capacity/reserve. 其他特性完全相同。
五.列表(list)
void unique(void);将容器中连续重复出现的元素唯一化。
void sort(void); // 用元素类型的小于号比大小
void sort(less cmp) // 用小于比较器比较大小
对容器中的元素排序
void splice(iterator pos,list&lst); 将lst中的全部元素剪切到调用列表的pos之前。
void splice(iterator pos,list&lst,iterator del); 将lst中的del元素剪切到调用列表的pos之前。
void splice(iterator pos,list&lst,iterator begin,iterator end); 将lst中[begin,end)区间的元素剪切到调用列表的pos之前。
void merge(list& lst);将有序的lst合并到有序的调用列表中,结果依然有序.
六.堆栈 stack
后进先出
底层容器:deque(默认)/vector/list
七.队列 queue
先进现出
底层容器:deque(默认)/list
八.优先队列(priority_queue)
优者先出
底层容器:vector/deque(默认)
优先级的确定:缺省情况下以大者为优,也可以通过小于比较器认为定制优先级的规则。