顺序容器类型:
顺序容器:
vector 支持快速随即访问
list 支持快速插入/删除
deque 双端队列
顺序容器适配器:
stack 后进先出栈(LIFO)
queue 先进先出队列(FIFO)
priority_queue 有优先级管理的队列
(一)顺序容器的定义
1.容器的定义和初始化
代码运行结果:
105 106 107 108 109
100 101 102 103 104 105 106 107 108 109
2.容器内元素的类型约束条件
a.元素类型必须支持赋值运算
b.元素类型的对象必须可以复制
例如:我们定义了一个类foo,但该类没有定义默认的构造函数,但提供了一个需要int型形参的构造函数;
现在,考虑下面的声明:
vector<foo> empty; //ok;no need for element default constructor
vector<foo> bad(10) //error;no default constructor for foo
vector<foo> ok(10,1) //ok:each element initialized to1
(二)迭代器和迭代器范围
迭代器的解引用操作:(*iter).mem与iter->mem等效。
使迭代器失效的容器操作:一些容器操作会修改容器内在状态或移动容器内元素,这样的操作会使所有被移动的元素的迭代器失效,也可能同时使其他迭代器失效,使用无效迭代器是没有意义的,可能会导致与悬垂指针相同的问题。 例如:每种容器都定义了一种或多种erase函数,这些函数提供了删除元素的功能,当执行此函数后,指向已删除元素的跌倒器是没有任何意义的,毕竟,该迭代器指向了容器中不再存在的元素。
无法检查迭代器是否有效,也无法通过测试来发现迭代器是否已经失效。任何无效迭代器的使用都可能导致运行时出错。但程序不一定崩溃,否则,检查这种错误会容易些。
(三)顺序容器的操作
1.reverse_iterator 和 rbegin,rend的结合用法:
程序执行结果为:
109 108 107 106 105 104 103 102 101 100
2.在顺序容器中添加元素
c.push_back(t) //在c的尾部添加值为T的元素。返回void类型
c.push_front(t) //在c的第一个元素的前面添加值为t的元素,返回void类型,只适用于list和deque容器类型
c.insert(p,t) //在迭代器p的前面插入值为t的元素,返回新添加元素的迭代器
c.insert(p,n,t) //在迭代器p的前面插入n个值为t的元素,返回void类型
c.insert(p,b,e) //在迭代器p所指向的元素前面插入由迭代器p和e标记的范围内的元素,返回void类型
程序运行结果:
9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9
11 11 11 11 11 11 11 11 11 11 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9
11 11 11 11 11 11 11 11 11 11
可以看到,vector虽然不支持push_front()操作,但可以用insert(s.front(),t)来替代此操作;
3.容器大小的操作
c.size() 返回容器中元素的个数
c.max_size() 返回容器中可容纳的最多的元素的个数
c.empty() 返回标记容器大小是否为0的布尔值
c.resize(n) 调整容器元素的大小,使其可容纳n个元素
c.resize(n,t) 调整容器元素的大小,使其可容纳n个元素,所有新添加的元素为t;
程序运行结果:
the elements of ivec is:
0 1 2 3 4 5 6 7 8 9
ivec's size is: 10
ivec's max_size is: 1073741823
after resize to 25,now the elements of ivec is
0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
now the size of ivec is:25
now the max_size of ivec is:1073741823
after resize to 50,now the elements of ivec is
0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 121 121 121 121 121 121 121 12
1 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121
now the size of ivec is:50
now the max_size of ivec is:1073741823
事实上,resize操作可能会使迭代器失效,在vector或deque上做resize操作可能会使其所有的迭代器都失效。
对于所有的容器类型,如果resize压缩了容器大小,则指向已删除的元素的迭代器失效。