Chapter9:顺序容器

现代C++程序应该使用标准库容器,而不是更原始的数据结构,例如内置数组。

新标准库容器的性能几乎肯定与最精心优化过的同类数据结构一样好。

当我们用一个对象来初始化容器时,或将一个对象插入到容器中时,实际上放入到容器中的是对象值的拷贝,而不是对象本身。

  • 容器选择原则
  1. 除非你有很好的理由选择其他容器,否则应使用vector;
  2. 如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list;
  3. 如果程序要求随机访问元素,应使用vector或deque;
  4. 如果程序需要在头尾位置插入或删除元素,而不会再中间位置插入或删除,使用deque;
  5. 如果程序只有在读取输入时才需要在中间位置插入元素,随后需要随机访问元素,则:
  • 首先确定是否真的需要在容器中间位置添加元素。(可以在vector中追加数据,然后sort重排)
  • 如果必须添加元素,则考虑输入阶段使用list;一旦完成,将list的内容copy到一个vector中。

Best Practice:如果不确定应该使用哪种容器,那么可以在程序中只使用vector和list的公共操作:使用迭代器。不使用下标操作,避免随机访问。

为了创建一个容器为另一个容器的拷贝,两个容器的类型及其元素类型必须匹配。不过,当传递迭代器参数来拷贝一个范围时,就不要求容器类型是相同的了,而且元素类型可以转换即可。

1 list<string> authors = { "Milton","Shakespeare","Austen" };
2 vector<const char*> articles = { "a", "an","the" };
3
4 list<string> list2(authors);//正确
5 vector<string> authors2(authors);//错误,容器类型不匹配
6 list<string> words(articles.begin(), articles.end());//正确
7 list<const string> ls(authors);//错误

虽然内置数组不能进行copy或者对象赋值工作,但array并没有这种限制。

由于右边运算对象的大小可能与左边运算对象的大小不同,因此array类型不支持assign,也不允许用花括号列表来赋值(但是可以初始化)

1 array<int, 4> digits = { 0,1,2,3 };
2 array<int, 4> copy = digits;//正确
3
4 array<int, 4> a1 = { 0,1,2,3 };
5 a1 = { 0,1,2,3 };//错误

swap:除array外,交换两个容器内容的操作会很快——元素本身并未交换,swap只是交换两个容器的内部数据结构。swap两个array会真正交换它们的元素。

  • 向容器中插入/删除元素

push_back(t), push_front(t),返回void;

insert(p,t), insert(p,n,t), insert(p,b,e), insert(p,il) 实在迭代器p元素之前插入元素,返回指向新添加的(第一个)元素的迭代器。

emplace_front(args), emplace_back(args),emplace(p,args)这些操作构造而不是拷贝元素。是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理的内存空间中直接构造元素。而调用push_back则会创建一个局部临时对象,并将其压入容器中。

  • 删除元素

pop_back(), pop_front(), clear()返回void;

erase(p),erase(b,e)删除元素,返回一个指向(最后)被删元素之后元素的迭代器;

  • forward_list

没有简单办法来获得前驱,所以其删除/插入都是after版本。

insert_after(p,t),insert_after(p,n,t),insert_after(p,b,e),insert_after(p,il),emplace_after(p,args)在迭代器p之后插入元素,返回一个指向最后一个插入元素的迭代器

erase_after(p), erase_after(b,e)删除p指向的位置之后的元素,返回一个指向北山元素之后元素的迭代器。

  • string的数值转换

新标准引入了多个函数,可以实现数值数据与标准库string之间的转换

to_string(val),

stoi/stoul/stol/stoll/stoull(s,p,b):返回s起始子串(表示整数部分)的数值,b表示基数,默认为10。P是size_t指针,用来保存s第一个非数值字符的下标。

stof/stod/stold(s,p)

时间: 2024-10-27 13:22:02

Chapter9:顺序容器的相关文章

第十篇:顺序容器vector,deque,list的选用规则

前言 常见的顺序容器主要有三种 - vector,deque,list.它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题. 分析 由于这三种容器实现的数据结构原型不同(vector实现原型是顺序表,deque是双端队列,list是链表),因此这三种容器对插入删除以及访问操作的开销是不同的.为了编制出高效的程序,我们应当通过分析容器操作的开销来选择容器. 访问操作对容器选择的影响 1. vector容器的随机访问效率最高: 2. deque容器的随机访问效率也高: 3

c++顺序容器(1)

1.顺序容器 C++标准库中有三种顺序容器:vector list deque vector:支持快速随机访问,在尾部之外的位置插入或删除元素可能较慢 list:支持快速插入/删除,只支持双向顺序访问 deque:双端队列,支持快速随机访问,头尾插入和删除速度很快 还有array(不能添加和删除),forward_list,String(保存字符) 2.哪种顺序容器好? 通常,使用vector. (1)如果要求在容器的中间插入和删除元素,应使用list或forward_list. (2)如果只在

顺序容器

C++顺序容器 1.C++的顺序容器包括:vector.list.deque. 2.初始化顺序容器的5中方法: (1)Create an empty container: list<string> slist; vector<int> vec; (2)Create a container of some size. Each element is initialized to its default value.(Recall that the default value for

C++primer(第五版)第九章 顺序容器(容器的运用及其部分习题解答,C++11特性总结,重点章节内容较多)

顺序容器:为程序员提供了控制元素存储和访问顺序的能力.(无序容器)           1.顺序容器的概述           A.顺序容器的类型           vector:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢.          deque:双端队列.支持快速随机访问.在头尾位置插入/删除速度很快.           list:双向链表.只支持双向顺序访问.在list中任何位置进行插入/删除操作速度都很快.          forword_list

顺序容器(二)--《C++ primer》

 前面已经简单介绍了顺序容器的定义以及一些操作,包括(添加,删除等),下面主要集中以代码的形式简单介绍一下相关用法,首先创建并初始化vector对象,一般有两大类: 1.分配指定数目元素,并初始化(分两种)          vector<int> ivec(10): vector<int> ivec(10,1): 2.把vecotr对象初始化为一段元素的副本 int a[10]={1,2,3,4,5,6,7,8,9,10}: vector<int> ivec(a,

c++顺序容器(2)

1.向顺序容器添加元素 c.push_back(t);c.emplace_back(args);//在c的尾部创建一个值为t或由args创建的元素,返回void.若在头部,back改为front c.insert(p,t);c,emplace(p,args);   c.insert(p,n,t);(插入n个)  c.insert(p,b,e);(迭代器范围) c.insert(p,i1);(列表) 注:a.除array和forward_list外,每个顺序容器都支持push_back. b.只有

C++ Primer 第九章顺序容器

一.综述 <vector>:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢. <deque>:双端队列.支持快速随机访问.在头尾位置插入/删除速度很快. <list>:双向链表.只支持双向顺序访问.在list中任何位置进行插入/删除操作速度都很快. <forward_list>:单向链表.只支持单向顺序访问.在链表任何位置进行插入/删除操作速度都很快. <array>:固定大小数组.支持快速随机访问.不能添加或删除元素.

第九章:顺序容器

一.顺序容器概述:一个容器就是一些特定类型对象的集合 1.顺序容器类型:vector.deque.list.forward_list.array.string string和vector将元素保存在连续的内存空间,所以用下标访问很快,但是在中间位置添加或删除元素很耗时 list和forward_list在任何位置添加和删除操作都很快,但是访问一个元素只能遍历它,而且额外的内存开销很大 forward_list设计的目的是与最好的手写的单向链表数据结构相当的性能 deque支持下标访问,且在两端添

C++标准库——顺序容器

容器是容纳特定类型对象的集合.顺序容器将单一类型元素聚集起来,并且根据位置来存储和访问这些元素.顺序容器中元素排列顺序与元素值无关,而是根据元素值添加到容器中的次序决定的. 标准库中有三种顺序容器,分别是vector,list与deque.其中vector支持随机的快速访问,因为vector中存放数据是在内存中连续存放的.在实际的实现中,vector会提前申请一块较大的内存空间(如果指定了大小,一般是指定大小的两倍),这样每次加入新的元素时不用再申请新的内存空间,提高效率.list容器是类似于链

c++11 顺序容器概括(1)

第一篇博文,希望不是最后一篇.o(∩_∩)o 哈哈 接下来几篇博文会由浅到深地介绍 STL 超好用的顺序容器. 容器:  就是一些特定类型对象的集合. 顺序容器:  定义:顺序容器是容器的一类.该类容器中,对象(元素)在 容器中的位置 与加入容器的顺序相对应,不依赖元素的值.         注意:顺序容器几乎可以保存任意类型的元素,但可能限制元素容器操作.详情请看下篇博文. 所有顺序容器公共的 特点 :  所以顺序容器都提供了快速顺序访问元素的能力. 顺序容器的类型 vector(常用) 1.