//1.vector:可变大小数组。支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢。注意点:不要在vector中存放bool类型,vector<bool>并不是一个容器,其实现方式类似于位域,不能对其元素取地址或者建立引用,因为其元素仅仅是一个比特。然而deque<bool>却是一个容器。
// deque:双端队列。支持快速随机访问,在头尾插入或删除元素很快。
// list:双向链表。只支持双向顺序访问。任何位置插入或删除元素都很快。
// forward_list:单向链表。只支持单向顺序访问。在任何位置插入或删除元素都很快。
// string:与vector相似的容器,专门用于保存字符。支持随机访问。在尾部插入或删除元素很快。 //2.通常情况选择vector,当不确定用哪种容器的时候,那么就只使用迭代器操作,这样在更换容器的时候会很方便。 //3.如果容器元素类型没有默认构造函数,当为此容器提供了大小参数外,还必须提供一个显示的元素初始值(这个显示的元素初始值必须能被构造成容器的元素类型)。
class CTest
{
public:
CTest(int i) : value(i){}
private:
int value;
}; vector<CTest> vecTest(2, 10); //vecTest = [2]({value=10 },{value=10 })
vector<CTest> vecTest1(2); //错误,没有传入初始值
vector<CTest> vecTest2; //正确 //4.公用容器的类型别名操作:
// iterator:此容器的迭代器类型
// const_iterator:只读迭代器类型
// size_type:无符号整形,足够保存此种容器类型最大可能容器的大小。32位程序下,为4字节,64位程序下为8字节。
// difference_type:带符号整形,足够保存两个迭代器之间的距离。32位程序下,为4字节,64位程序下为8字节。在32位下应用程序可使用的内存小于2G,也就是小于int的最大值。
// value_type:容器所存元素类型。
// reference:容器所存元素的引用类型。等价于value_type&
// const_reference:容器所存元素的常量引用类型。等价于const value_type& //5.反向迭代器与正向迭代器相比,各种操作的含义均发生颠倒。例如++会得到反向迭代器的上一个元素。 //6.可以将A容器中的元素拷贝到B容器中,只要A容器的元素类型能转换为B容器的元素类型
list<double> listDouble;
listDouble.emplace_back(1.1);
listDouble.emplace_back(2.2);
vector<int> vecInt(listDouble.begin(), listDouble.end()); //vecInt = [2](1,2)
vector<int> vecInt1;
vecInt1.assign(listDouble.begin(), listDouble.end()); //vecInt1 = [2](1,2)
// 注意点:容器的assign操作还有一种用法:vecInt1.assign(2,1); //vecInt1 = [2](1,1) //7.当改变了容器的元素后,注意指向容器元素的迭代器、指针、引用可能会失效。比如容器的赋值操作就会导致上述结果。在每次改变容器的操作后都应该重新定位迭代器、指针、引用。 //8.容器的emplace系列的函数,使用给定的参数创建一个元素(如果不是内置类型则调用其构造函数),而push_back或者push_front函数则是按值拷贝一个元素(不会主动调用元素的构造函数)。insert在这方面的表现和push_back系列函数一致。
vector<unique_ptr<char[]>> vecStr;
vecStr.emplace_back(new char[10]()); //合法
vecStr.push_back(new char[10]()); //非法
vecStr.insert(vecStr.begin(), new char[10]()); //vs2010下虽然合法,但是从语法上来说,这句话是错误的。

#include <vector>
  using std::vector;

class CTest
  {
  public:
  explicit CTest(int value)
  {
      value0 = value;
      printf("0 ");
  }

CTest(const CTest& Test)
  {
      value0 = Test.value0;
      printf("1 ");
  }

private:
      int value0;
  };

int _tmain(int argc, _TCHAR* argv[])
  {
      vector<CTest> vecTest(1, CTest(0));//输出0 1    这是先进行构造然后将其拷贝进vector

CTest Test(3);              //输出0
      vecTest.push_back(Test);    //输出1 1    这是先拷贝构造然后将其拷贝进vector

//vecTest.push_back(1);     //由于构造函数是explicit的,所以这句话非法

vecTest.emplace_back(2);    //输出1 1 0  前面两个1是因为vector发生内存重新分配,所以拷贝了原先的2个元素,最后一个0是直接构造
      printf("s");

    //由上述代码得出结论,emplace系列函数比push系列函数的效率,在理论上高点
  }

//9.容器中不能存放元素的引用。

//10.一般容器都提供了front()和back()成员函数,分别用于返回首尾元素的引用。一般容器提供了at()成员函数,用法类似于下标运算符,但是前者多了判断下标是否越界的功能,若越界则会抛出out_of_range异常。

//11.单向链表forward_list的插入和删除操作:insert_after,emplace_after,erase_after。由于单向链表可以方便的得到其下一个成员而无法得到其上一个成员,所以其插入和删除操作不同于其他容器,相应的before_begin返回单向链表的首前迭代器。

//12.利用resize成员函数可以很方便的改变容器的大小,支持为要新添加的元素传入初始化参数。
// 利用reserve成员函,来分配至少能容纳指定个元素的内存空间。注意点:这里仅是内存分配而不涉及元素构造,此函数不会改变容器的size,但是会改变容器的capacity。 //13.string类的常用操作:
// c_str():返回const char*类型的字符串
// substr:从指定的string中的指定位置返回指定长度的string
// find:查找指定序列在指定位置后第一次出现的位置
// rfind:查找指定序列在指定位置后最后一次出现的位置
// find_first_of:查找指定序列在指定位置后第一次出现序列中的元素的位置
// find_last_of:查找指定序列在指定位置后最后一次出现序列中的元素的位置
// find_first_not_of:在指定位置后查找第一个不在指定序列中的元素的位置
// find_last_not_of:在指定位置后查找最后一个不在指定序列中的元素的位置
// replace:将指定的序列中的元素替换为另一个指定序列中的元素 //14.容器适配器:一个容器适配器能接受一种已有的容器类型,使其行为看起来像一种不同的类型。
// stack:定义在头文件stack中,在栈顶进行操作。
// 支持操作:pop(),push(),emplace(),top()
// 默认使用deque实现,也可以在list或者vector之上实现。
// queue:定义在头文件queue中,其元素为先进先出。进入的元素放置在队尾,在队首进行删除。
// 支持操作:pop(),front(),back(),push(),emplace()
// 默认使用deque实现,可以用list和vector实现。
// priority_queue:定义在头文件queue中。允许我们为队列中的元素建立优先级。默认使用<来确定相对优先级(由大到小排列)。
// 支持操作:pop(),push(),emplace(),top()。注意:top()返回priority_queue中优先级最高的元素。支持随机访问。
// 默认使用vector实现,也可以用deque实现
stack<int, vector<int>> staInt; //使用非默认容器来构造容器适配器。 //15.
// begin(),end() ++ ->
// begin() end()
// | |
// v v
// AAAAAAAAAAAAAAAAA
// ^ ^
// | |
// rend() rbegin()
// rend(), rbegin() -- ->

  

C++Primer 第九章的更多相关文章

  1. C++ Primer : 第九章 : vector变长、string的其他操作以及容器适配器

    vector变长机制.string的其他构造方法,添加.替换和搜索操作,string比较和数值转换,最后是容器适配器. vector对象是如何增长的 vector和string类型提供了一些成员函数, ...

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

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

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

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

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

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

  5. C++ Primer第九章课后编程问题

    1. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3V1Z2xlMjAxMA==/font/5a6L5L2T/fontsize/400/fill/I0J ...

  6. C++ Primer Plus学习:第九章

    C++第九章:内存模型与名称空间 C++在内存中存储数据方面提供了多种选择.可直接选择保留在内存中的时间长度(存储持续性)以及程序哪一部分可以访问数据(作用域和链接)等. 单独编译 程序分为三个部分: ...

  7. 【C++】《C++ Primer 》第九章

    第九章 顺序容器 一.顺序容器概述 顺序容器(sequential container):为程序员提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应. 不同 ...

  8. 精通Web Analytics 2.0 (11) 第九章: 新兴分析—社交,移动和视频

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第九章: 新兴分析-社交,移动和视频 网络在过去几年中发生了不可思议的发展变化:从单向对话到双向对话的转变; 由视频,Ajax和 ...

  9. 第九章:四大组件之Broadcast Receiver

    第九章:四大组件之Broadcast Receiver   一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和 ...

随机推荐

  1. 读取C#AssemblyInfo文件中的AssemblyVersion中的值

    System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); 1.程序集的版本信息由下面四个值组成:主 ...

  2. varnish中忽略cookie进行缓存

    varnish不缓存cookie的页面,如果html页面中带有cookie以下代码为接收到结尾的文件,自动去除掉cookiesub vcl_recv {    if (req.request == ” ...

  3. ArcGIS for Sever 10.1 服务迁移与恢复

    === 声明:以下内容本是自己写给单位内部同事的参考手册,但是被传到百度文库中.陆续有用户就这方面的问题,通过电话,邮件等方式联系我.首先,感到荣幸.其次是,由于本人当时测试和编写的时候,由于仓促,可 ...

  4. 错误记录--The import XXX cannot be resolved

    错误:The import XXX cannot be resolved弄了好久,import类的都没问题,但就是报错.选择project --> clean后,OK.如果还不行,删掉全部imp ...

  5. PHP5 mysqli 教程

    mysqli提供了面向对象和面向过程两种方式来与数据库交互,分别看一下这两种方式. 1.面向对象 在面向对象的方式中,mysqli被封装成一个类,它的构造方法如下: __construct ([ st ...

  6. php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;

    Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ pr ...

  7. GATT 服务器与客户端角色

    两个设备应用数据的通信是通过协议栈的GATT层实现的.从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一: GATT服务器: 它是为GATT客户端提供数据服务的设备 GATT客户端:  ...

  8. Redis-统计活跃用户

    Bitmap(即Bitset)Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR以及其它位操作. package test ...

  9. Google物联网操作系统协同框架Weave深度解析

    1.       Google Weave框架 在2015年的Google I/O大会上,负责Android业务的桑达.皮查伊(SundarPichai)宣布了Google最新的物联网战略.这包括一个 ...

  10. java多线程编程(二创建线程)

    1.概念           因为java是完全面向对象的,所以在java中,我们说的线程,就是Thread类的一个实例对象.所以,一个线程就是一个对象,它有自己字段和方法. 2.创建线程 创建线程有 ...