代码改变世界

容器

2015-02-06 01:01  sylar_liang  阅读(241)  评论(0编辑  收藏  举报

1.顺序容器(序列式容器):

vector:支持快速随机访问

list:支持快速插入/删除

deque:双端队列

 

关联式容器:set,multiset,map,multimap

 

顺序容器适配器
stack:后进先出(LIFO)堆栈

queue:先进先出(FIFO)队列

priority_queue:有优先级管理的队列

 

PS:将一个容器复制给另一个容器时类型必须匹配:容器类型和元素类型都必须相同。

尽管不能直接将一种容器内的元素复制给另一种容器,但系统允许通过传递一堆迭代器间接实现该功能。

如:

vector<int> ivec;

list<int> ilist<ivec>; // error

vector<double> dvec(ivec); // error

list<string> slist(svec.begin(), svec.end()); // ok

 

关系操作符只适用于vector和deque的迭代器。

如: iter+n; > >= < <=

ilist.begin()+ilist.size()/2; // error.list容器的迭代器既不支持算术运算也不支持关系运算。

 

容器定义的类型别名

size_type:无符号整型,足以存储此容器类型的最大可能容器长度。

const_iterator:元素的只读迭代器类型

const_reverse_iterator:元素的只读(不能写)逆序迭代器

difference_type:足够存储两个迭代器差值的有符号整型,可为负数

value_type:元素类型

reference:元素的左值类型,是value_type&的同义词

  

关键概念:容器元素都是副本。

 

>>任何添加(insert/push)或删除(erase,pop_front, pop_back)或resize操作都可能导致迭代器失效。程序必须确保迭代器在每次循环后都得到更新。

>>赋值和assign操作使左操作数的所有迭代器失效,swap操作则不会使迭代器失效

assign操作首先会删除容器中原来存储的所有元素,所以不能传指向该容器的迭代器。

>>不要存储end操作返回的迭代器

 

char* cp = "hello"; // 以空字符结尾

char c_array[] = "world!"; // 以空字符结尾

char no_null[] = {'H', 'i'}; // 不是以空字符结束.

string s1(cp); // ok

string s2(c_array); // ok

string s3(no_null); // runtime error.

 

 

P451================