容器
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================