标准库里面定义了三种顺序容器:vector(支持快速随机访问),list(支持快速插入/删除),deque(双端队列)。标准库还提供了三种适配器:stack(后进先出(栈)),queue(先进先出(队列)),priority_queue(有优先级管理的队列)。
1.迭代器和迭代器的范围:所有的容器都支持:接引用、自增、自减、以及相等和不等操作。但是vector和deque的迭代器还支持:算术运算(iter+/-n),复合赋值、关系运算 操作。
2.顺序容器的操作:
(1)容器定义的类型主要有:size_type(无符号整形,表明容器的长度)、iterator(容器的迭代器)、const_iterator(元素只读迭代器)、reverse_iterator(按逆序寻址元素的迭代器)、reference(元素的左值类型,是value_type&的同义词)等等。
(2)begin()和end(),rbegin()和rend()。
(3)在顺序容器中添加元素:所有的容器都支持c.push_back(t)操作。c.push_front(t)在容器前端添加元素,只适用于list和deque容器。
c.insert(p,t)在迭代器p所指向的元素前面插入值为t的新元素,返回指向新添加元素的迭代器。c.insert(p,n,t)在迭代器p所指向的元素前面添加n个t的新元素,返回void类型。c.insert(p,b,e)在迭代器p所指向的元素前面插入有迭代器b和e标记的范围内的元素,返回void类型。
注意:在容器中添加或者插入元素可能会是迭代器失效,因此在使用时要确保每一次都要更新迭代器。并且尽量避免存储end操作返回的迭代器。
如:vector<int>::iterator iter=v.begin(),iter2=v.end();这种情况应该尽量避免。
3.关系操作符:所有的容器都支持用关系操作符来实现两个容器的比较。但是比较的容器必须具备相同的容器类型和相同的元素类型。
如果两个容器的长度相同并且元素也相等则荣器才相等,如果容器的长度不相等,但一个容器是另一个容器的子序列,则长的容器大于短的容器,如果两个容器都不是对方的子序列的话,大小取决于两个容器第一个不相等的两个元素的大小。
4.容器大小的操作:所有容器都提供四种大小相关的操作:
c.size()(返回size_type类型),
c.max_size()(容器最多可容纳的元素个数),
c.empty()(返回布尔类型,判断大小是否为0),
c.resize(n) 调整容器大小,使其容纳n个元素,如果n<c.size(),则删除多出来的元素,否则采用值初始化添加新的元素
c.resize(n,t) 调整容器大小,使其容纳n个元素,如果n<c.size(),所添加新的元素值都为t。
5.访问元素操作:
if(!ilist.enpty())
{
list<int>::reference val=*ilist.begin();(间接法得到容器的第一个元素,即利用begin()得到第一个元素的迭代器,在通过引用得到相应的元素的值)
list<int>::reference val2=ilist.front();(直接法得到容器的第一个元素,即利用front()得到第一个元素的值。)
list<int>::reference last=*--ilist.end();(间接法)
list<int>::reference last2=ilist.back();
}
c.back()返回容器c的最后一个元素的引用.
c.front()返回容器c的第一个元素的引用。
c[n] 小标为n的元素(只适用于vector和deque)
c.at(n) 返回下标为n的元素的引用(只适合于vector和deque)
6.删除元素:
c.erase(p)删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素。
c.erase(p,e)删除迭代器p和e所标记的范围的元素,返回一个迭代器,它指向被删除元素段后面的元素。
c.clear()删除容器内所有的元素,返回void类型
c.pop_back()删除容器c的最后一个元素,返回void类型
c.pop_front()删除容器c的第一个元素,返回void类型。
7.赋值与swap
赋值和assign操作会使迭代器失效,swap操作则不会使迭代器失效
c1=c2 删除c1容器中所有的元素,然后将c2容器中的所有元素复制给c1.c1和c2必须类型相同
c1.swap(c2) 交换内容,c1存放的是原来c2中的内容,c2中存放的是c1中的内容。
c.assign(b,e)重新设置c的元素:将迭代器b和e标记范围内的所有的元素复制到c中,b和e必须不是只想c中的迭代器
c.assign(n,t)将容器c重新设置为存储n个值为t的元素
(待续)