一、初识顺序容器
顺序容器,根据位置来存储和访问这些元素,有vector/list/deque
#include <vector>; vector<string> svec;
#include <list>; list<int> ilist;
#include <deque>; deque<Sales_item> items;
二、容器的初始化
C<T> c;创建一个名为c的空容器(使用于所有容器,all)
C<T> c(c2);创建c2的副本c,c2的类型必须与c相同,包括容器类型和元素类型(all)
C<T> c(b,e);创建c,其元素是迭代器b和e标示的范围内元素的副本,不要求容器类型或元素类型相同,只要相互兼容。另外e只是提供复制终止的条件,其位置元素没有复制(all)
C<T> c(n, t);用n个值为t的元素创建容器c(只适用于顺序容器)
C<T> c(n);创建有n个值初始化元素的容器c,T必须是内置或复合类型,或者是提供了默认构造函数的类类型(只适用于顺序容器)
容器类型必须满足两个约束:
(1)元素类型必须支持赋值运算;
(2)元素类型的对象必须可以复制。
引用类型不支持一般意义的赋值运算,因此没有引用类型的容器。
IO类型不支持复制或赋值。
容器的容器
vector<vector<string> > lines;//必须加空格,区别于>>右移操作符
三、迭代器
迭代器为所有标准库容器类型所提供的运算:
*iter; iter->item; ++iter; iter++; --iter; iter--; iter1 == iter2; iter1 != iter2;
只适用于vector和deque的运算:
iter+n; iter-n; iter1+=iter2; iter1-=iter2;
iter1-iter2; >, >=, <, <=;相减和比较运算两边的iter必须指向同一个容器中的元素
四、容器定义的类型
size_type:无符号整数,足以存储此容器类型的最大可能容器长度
iterator
const_iterator:只读迭代器
reverse_iterator:逆序寻址的迭代器
const_reverse_iterator
difference_type:足以存储两个迭代器差值的有符号整数,可为负数
用方法:vector<int>::iterator iter;
c.begin
c.end
c.rbegin:返回逆序迭代器,指向容器的最后一个元素
c.rend:返回逆序迭代器,指向容器的第一个元素前面的位置
如果容器是const,则返回的迭代器是const_iterator或const_reverse_iterator;如果容器不是const,则返回的迭代器是iterator或reverse_iterator。
五、在容器中添加元素
在顺序容器中添加元素的操作:
c.push_back(t):在c尾部添加值为t的元素,返回void。只适用于vector和deque。
c.push_front(t):在c前端添加值为t的元素,返回void。只适用于vector和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迭代器失效,因此避免存储end操作返回的迭代器。
六、关系操作符
所有的容器类型都支持用关系操作符来实现两个容器的比较,比较的容器必须具有相同的容器类型,而且其元素类型也必须相同。容器的比较式基于容器内元素的比较。例如:两个容器做!=比较使用了其元素类型定义的!=操作符。如果容器的元素类型不支持某种操作符,则该容器就不能做这种比较运算。
七、容器大小的操作
适用于所有容器的操作:
c.size();//返回c中的元素个数
c.max_size();//返回容器c可容纳的最多元素个数
c.empty();//容器大小为0时,返回true
c.resize(n);//调整容器c的长度大小,使其容纳n个元素。如果n<c.size(),则删除多出来的元素;否则,添加采用值初始化的新元素。
c.resize(n,t);//调整容器c的大小,使其能容纳n个元素。所有新添加的元素值都为t。
八、访问元素
访问顺序容器内元素的操作:
c.back();//返回容器c的最后一个元素的引用
c.front();//返回容器c烦人第一个元素的引用
c[n];//返回下标n的元素的引用,如果越界,则操作未定义
c.at(n);//返回下标为n的元素的引用,如果越界,则at函数会抛出out_of_range异常
九、删除顺序容器内的元素
c.erase(p);//删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素。
c.erase(b,e);//删除迭代器b和e所标记范围内的元素,返回一个迭代器,它指向被删除元素段后面的元素。
c.clear();//删除c内的所有元素
c.pop_back();//删除c的最后一个元素
c.pop_front();//删除c的第一个元素,适用于list或deque,不适用于vector