一、初识顺序容器

顺序容器,根据位置来存储和访问这些元素,有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

posted on 2013-03-31 17:01  guoxiang  阅读(219)  评论(0编辑  收藏  举报