chapter 9 顺序容器

顺序容器的初始化

1 C<T> c(c1);//cc1类型必须匹配:容器类型和元素类型均相同

2 C<T> c(b,e);//初始化c为迭代器be范围内的副本,元素类型兼容即可

3 C<T> c(n,t);//初始化为nt值,tC的元素类型兼容即可,只适用于顺序容器

4 C<T> c(n);//只适用于顺序容器,T类型必须有默认构造函数或内置类型

容器的容器:

Vector<vector<string> > lines;//两个连续的>之间必须有空格

容器以及迭代器的运算

list类型迭代器不支持算术运算,也不支持关系运算,但提供自增自减、解引用以及相等(不等)运算;

vector和deque类型的迭代器支持所有运算;

所有容器均支持关系运算(容器类型和元素类型均相同),且其关系运算取决于其元素类型定义的关系运算。

容器的迭代器失效问题:

vectordeque容器添加或者删除元素会使迭代器失效,一般不要存储end操作返回的迭代器,例如

vector<int>::iteratorfirst=ivec.begin(),last=ivec.end();

    while(first!=last)

    {

        first=ivec.insert(++first,42);

        ++first;

    }

这段代码运行时会出现错误,因为采用insertvector或者deque添加元素后会使存储在last的迭代器失效。

vector或者deque容器使用resize()操作也有可能会使迭代器失效。

但是注意:相同的操作对list不会产生影响,即若将上述代码改为对list容器操作,程序将正常运行,不会出现错误。

对于所有的容器类型,如果用resize操作压缩了容器,则指向删除元素的迭代器都会失效。

顺序容器特点总结:

1vector容器:

内部数据结构:数组,元素连续存储;

支持快速随机访问每个元素,所需的时间为常量;

在末尾增加或者删除元素所需时间与元素数目无关(即不需要移动任何其它元素),在中间或者开头添加或者删除元素所需时间随元素数目呈线性变化(需要移动被插入或删除元素右边所有的元素);

可以动态增加或删除元素,内存管理自动完成,程序员也可以使用reserve()成员函数来管理内存,其迭代器在内存重新分配时失效,一般实际分配的容量会比当前所需的空间要多一些,来实现vector快速的内存分配,所以实际上vectorlistdeque容器的增长效率通常要高;

添加元素时,若添加元素个数大于容器容量capacity(size概念不同),则内存会重新分配,所有迭代器均失效;若容量未满,则指向当前元素以后的任何元素的迭代器均失效;

删除元素时,指向被删除元素以后的任何迭代器均失效。

2deque容器

内部数据结构:数组,结构更加复杂;

支持快速随机访问每个元素,所需的时间为常量;

在开头或末尾增加或者删除元素所需时间与元素数目无关(速度非常快),在中间添加或者删除元素所需时间随元素数目呈线性变化(代价更高);

可以动态增加或删除元素,内存管理自动完成,不提供用于内存管理的成员函数;

在开头或末尾添加元素不会使deque的任何迭代器失效,在头或尾删除元素时,只有指向该元素的迭代器失效;

deque的中间任何位置插入或删除元素时,其迭代器都会失效。

3list容器

内部数据结构:双向环状链表,非连续存储,可以双向遍历;

支持在任意位置快速插入或删除元素且不需要移动任何其它元素,但是不支持随机访问,在list容器的元素之间移动的唯一方法是顺序跟随指针,例如若从5号元素移动道15号元素,则必须遍历它们之间所有的元素;

在任何地方增加或删除元素所需时间为常量;

可以动态增加或删除元素,内存管理自动完成(不存在容量capacity的概念);

增加任何元素都不会使迭代器失效;

删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器均不会失效。

 

容器的赋值与swap

赋值操作c1=c2c1c2容器类型和元素类型必须匹配;

交换c1.swap(c2)c1c2容器类型和元素类型必须匹配;

重置c.assign(b,e)c.assign(n,t):只要元素类型相互兼容即可,容器类型可以不相同;

注意:赋值操作和assign操作首先删除左操作数容器的所有元素,然后重设容器内容,所以会使左操作数的迭代器失效;但是swap不会,尽管交换了元素,迭代器仍然指向相同的元素,因为swap不会插入或删除任何元素

 

容器适配器

提供两种构造函数:

A a; //空适配器,名为a

A a(c);//初始化为容器c的副本

例:stack<int> stk;   stack<int> stk2(vec);

关联基础容器类型:

Stack<string, vector<string> >str_stk;

Stack<string, vector<string> >str_stk1(svec);

注意: stack 可以关联任意一种基础顺序容器(默认建立在 deque ); queue 适配器需要提供 push_front 操作,所以只能关联 list ,不能关联 vector ;而 priority_queue 需要支持随机访问,所以只能关联 vector deque ,不能关联 list 容器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值