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

原创 2012年03月26日 10:10:22
顺序容器:
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 100


second.assign (first.begin(),first.end()); // a copy of first


int myints[]={1776,7,4};
first.assign (myints,myints+3); // assigning from array
cout << "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:优先队列,插入元素的话将其放在优先级低的元素前面。

相关文章推荐

C++Primer学习笔记(9)顺序容器

(1)顺序容器将单一类型元素聚集起来成为容器,然后根据位置来存储和访问。 (2)标准库提供了vector,list,deque三种顺序容器以及stack,queue, priority_queue三种...

读书笔记:C++ primer 5th edition--chapter9.顺序容器

part1.概述 1.类型:vector,deque,list,forward_list,array,string 2.与内置数组类似,array对象大小固定,不支持添加删除。 3.forwar...
  • lebula
  • lebula
  • 2016年10月07日 21:35
  • 142

【C++ Primer 学习笔记】chapter9 顺序容器

顺序容器类型 1. 顺序容器 vector 支持快速随机访问 list 支持快速插入/删除 deque 双端队列 2. 顺序容器适配器 stack 后进先出(LIFO)栈 queue 先...
  • gxuan
  • gxuan
  • 2012年09月07日 20:38
  • 551

再学C++ Primer(2)-变量与基本类型

这一章主要介绍了c++中的基本数据类型,还有一些编程的技巧。 记录有如下几点: 1.通过增加后缀,能够强制将字面值整数常量转换为long或unsigned,unsigned long类型,如 1...

第九章-顺序容器----重学C++之《 C++ PRIMER》

本章讲解了顺序容器以及他们通用的接口操作。 涉及的容器有:顺序容器vector,list,deque,并提及了stack,queue,priority_queue这三种容器适配器。最常用的容器是ve...

再学C++ Primer(5)-表达式

在求模或取余中如果有一个操作数是负数,这两种操作的结果取决于机器。 若仅靠左操作数的值无法确定该逻辑表达式的结果,才会求解其右操作数的值-短路求值。 关系操作符具有左结合性,如if...

再学C++ Primer(11)-模板与泛型编程

泛型编程与面向对象编程一样,都依赖于某种形式的多态性。面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或者参数式多态性。 在泛型编程中,我们所编写的类和函数都能多态地...

再学C++ Primer(7)-函数

不适宜复制实参的情况: 1)当需要在函数中修改实参的值时; 2)当需要以大型的对象作为实参时; 3)当没有办法实现对象复制时;  使用引用形参返回额外的信息 #include #...

再学C++ Primer(8)-标准IO库

没看懂,以后上。 2012-3-26 C++的输入输出由标准库提供。标准库定义了一族类型,支持对文件和控制窗口等设备的读写。 主要有下面几个类型: iostream istream从...

再学C++ Primer(12)- C++中的高级内存管理

C++ primer的最后一章,虽说是高级主题,但其实是一些非常有用的东西,包括内存分配,RTTI,volatile等等。new/deleteC++中内存方面最常用的就是new表达式和delete表达...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:再学C++ Primer(9)-顺序容器
举报原因:
原因补充:

(最多只允许输入30个字)