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

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

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

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

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

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

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

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

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

 array<int, > digits = { ,,, };
array<int, > copy = digits;//正确 array<int, > a1 = { ,,, };
a1 = { ,,, };//错误

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)

Chapter9:顺序容器的更多相关文章

  1. Chapter9(顺序容器) --C++Prime笔记

    PS:删除元素的成员函数并不检查其参数.在删除元素之前,程序员必须确保它们是存在的. 1.迭代器的范围是[begin,end)左闭右开. 2.对构成迭代器的要求: ①它们指向同一个容器中的元素或者容器 ...

  2. C++ 顺序容器基础知识总结

    0.前言 本文简单地总结了STL的顺序容器的知识点.文中并不涉及具体的实现技巧,对于细节的东西也没有提及.一来不同的标准库有着不同的实现,二来关于具体实现<STL源码剖析>已经展示得全面细 ...

  3. c++ 顺序容器学习

    所谓容器,就是一个装东西的盒子,在c++中,我们把装的东西叫做“元素” 而顺序容器,就是说这些东西是有顺序的,你装进去是什么顺序,它们在里面就是什么顺序. c++中的顺序容器一共有这么几种: vect ...

  4. C++ Primer 第九章 顺序容器

    由于书籍上写的已经很经典了,故大部分用图片的形式来阐述概念,代码纯手打进行验证. 1.顺序容器类型:vector.deque.list.forword_list.array.string. 2.顺序容 ...

  5. C++学习基础四——顺序容器和关联容器

    —顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue ...

  6. C++ 顺序容器

    <C++ Primer 4th>读书笔记 顺序容器内的元素按其位置存储和访问.容器类共享公共的接口,每种容器类型提供一组不同的时间和功能折衷方案.通常不需要修改代码,只需改变类型声明,用一 ...

  7. C++ Primer : 第九章 : 顺序容器的操作以及迭代器失效问题

    顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的inse ...

  8. C++ Primer : 第九章 : 顺序容器的定义、迭代器以及赋值与swap

    顺序容器属于C++ STL的一部分,也是非常重要的一部分. 顺序容器包括: std::vector,包含在头文件<vector>中 std::string, 包含在头文件<strin ...

  9. 顺序容器:vector,deque,list

    1.顺序容器:vector,deque,list 容器类共享公共接口,只要学会其中一种类型就能运用另一种类型.每种容器提供一组不同的时间和功能这种方案,通常不需要修改代码,秩序改变类型声明,每一种容器 ...

  10. C++ Primer 随笔 Chapter 9 顺序容器

     参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...

随机推荐

  1. Django学习笔记——安装(linux环境)

    1. 下载安装Django pip install Django== 测试是否安装成功 >>> import django>>> django.VERSION (1 ...

  2. 16_采用SharedPreferences保存用户偏好设置参数

    按钮事件 <Button android:id="@+id/button" android:layout_width="wrap_content" and ...

  3. 12.allegro环境设置[原创]

    一.菜单简介 --- 分割电源,分割平面 ------- ------- ------- ----- --------- ---- --------------- ----------------- ...

  4. HDU4749 Parade Show(KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题意:给出两个数字串A.B.问A中有多少不相交的子串a能匹配B.匹配的意思是a中任意两个位置i和 ...

  5. 《OD大数据实战》Hive环境搭建

    一.搭建hadoop环境 <OD大数据实战>hadoop伪分布式环境搭建 二.Hive环境搭建 1. 准备安装文件 下载地址: http://archive.cloudera.com/cd ...

  6. 聚合函数字段注意.where和having的区别

    当使用聚合函数时,出现在select中的字段要么出现在聚合函数里,要么出现在group by 子句里.像下面这句是错误的: 1 SELECT  detno,AVG(sal),job FROM  emp ...

  7. 安卓WebView中接口隐患与手机挂马利用(远程命令执行)

    安卓应用存在安全漏洞,浏览网站打开链接即可中招.目前有白帽子提交漏洞表明目前安卓平台上的应用普遍存在一个安全漏洞,用户打开一个链接就可导致远程安装恶意应用甚至完全控制用户手机,目前微信,手机QQ,QV ...

  8. iOS 8 AutoLayOut入门

    http://blog.csdn.net/asdfg13697116596/article/details/42562565 iOS 8 AutoLayOut入门自从iOS6带来Auto Layout ...

  9. acdream 1682 吃不完的糖果(环形最大子段和)

    Problem Description 娜娜好不容易才在你的帮助下"跳"过了这个湖,果然车到山前必有路,大战之后必有回复,大难不死,必有后福!现在在娜娜面前的就是好多好多的糖果还有 ...

  10. hibernate中使用fetch来决策性能方案

    什么时候用子查询,或者连接查询 一般多个数据的对应用子查询,单一行的数据用连接 (若要查询每个学生分别学了什么课程 ,若要fetch=join.fetch=select) 则是这种情况 Hiberna ...