再学C++ Primer(9)-顺序容器

来源:互联网 发布:简单拼图软件 编辑:程序博客网 时间:2024/06/06 08:30
顺序容器:
vector: 支持快速随机访问;
list:支持快速插入/删除,类似与链表
deque:双端队列。
使用默认构造函数能达到最佳运行时性能,并使容器更易使用。


将一个容器初始化为另一个容器的副本:
vector<int> ivec;
vecror<int> ivec2(ivec);
容器类型和元素类型都必须相同。


接受容器大小做形参的构造函数只适用于顺序容器,而关联容器不支持这种初始化。


容器元素类型必须满足以下两个约束:
1)元素类型支持赋值运算;
2)元素类型的对象必须可以复制


使用迭代器编写程序时,必须留意哪些操作会使迭代器失效,(如元素的增加和删除)。
使用无效的迭代器将会导致严重的运行错误,当编写循环将元素插入到vector或deque容器
时,程序必须确保迭代器在每次循环后都得到更新。


reverse_iterator:逆迭代器,按逆序寻址的迭代器,从后向前遍历容器,并反转了某些
相关的迭代器操作。


容器的关系操作符:类似于字符串的关系运算,且只允许两个容器做其元素类型定义的关系运算。


容器的assign操作:赋给容器全新值,操作首先会删除容器中原来存储的所有元素。 有两个版本。
容器的swap操作:不会删除或插入任何元素,而且在常量时间内实现交换。
例子:
#include <iostream>#include <list>using namespace std;int main (){list<int> first;list<int> second;first.assign (7,100); // 7 ints with value 100second.assign (first.begin(),first.end()); // a copy of firstint myints[]={1776,7,4};first.assign (myints,myints+3); // assigning from arraycout << "Size of first: " << int (first.size()) << endl;cout << "Size of second: " << int (second.size()) << endl;return 0;}




Output:
Size of first: 3
Size of second: 7


每当vector容器不得不分配新的存储空间时,以加倍当前容量的分配策略重新分配。
以最小的代价连续存储元素。由此而带来的访问元素的便利弥补了其存储代价。


容器的特点及选择:
选择容器要考虑的问题:
1)在容器的中间位置添加或删除元素的代价;
2)执行容器元素的随机访问的代价。


vector和deque:优点:快速随机访问;缺点:任意位置插入或删除元素代价大,类似数组。
list:优点:在任意位置都能快速插入和删除;缺点:随机访问慢,类似链表;
deque和vector的一个不同点:deque提供高效地在其首部实现insert和erase的操作,就像在容器尾部一样。


在deque容器首部或尾部插入元素不会使任何迭迭代器失效。


由于vector容器的每次访问都是距离其起点的固定偏移,因此其随机访问非常有效率。在list容器中,元素之间移动的唯一
方法是顺序跟随指针。


选择容器的原则:
1)如果程序要求随机访问元素,则选deque或vectore;
2)如果程序必须在容器的中间位置插入或删除元素,则应采用list容器;
3)如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则采用deque;
4)如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将元素读入到一个
list容器,接着对此容器排序,使其适合顺序访问,然后将排序后的list容器复制待一个vector中。
总之,决定使用哪种容器可能需要剖析各种容器类型完成应用所要求的各类操作的性能。


priority-queue:优先队列,插入元素的话将其放在优先级低的元素前面。
原创粉丝点击