条款13:vector、string优先于动态分配数组

string是basic_string<char>的类型定义
许多string的背后实现都采用了引用计数的技术,可以消除不必要的内存拷贝和不必要的字符拷贝

条款14:使用 reserve 来避免vector容器不必要的重新分配

vector和string的 realloc 的操作分为4部分:
a.分配一块大小为当前容量的某个倍数的新内存,大多数实现中,vector和string的容量每次以2倍增长
b.把容器的所有元素从旧的内存拷贝到新的内存中
c.析构掉旧内存中的对象
d.释放旧内存
注:任何push、insert操作可能导致内存重分配.重分配之后原来的迭代器、指针、引用全部失效

vector、string的4个成员函数:
a.size():容器中现有多少个元素
b.capacity():容器现分配的内存可以容纳的元素总数
c.resize(vector::size_type n):强迫容器改变到包含n个元素的状态
如果n小于当前size(),则容器尾部的元素将会被析构
如果n小于当前capacity(),则通过默认构造函数创建的新元素被添加到容器的末尾
如果n大于当前capacity(),则会重新分配内存
d.reserve(vector::size_type n):强迫容器把它的容量capacity变为至少是n,前提是n不小于当前大小

vector<int> vec;
for (int i = ; i < ; ++i) vec.push_back(i); //导致10次重分配内存, log(1000) vector<int> vec;
vec.reserve();
for (int i = ; i < ; ++i) vec.push_back(i); //循环过程中不会重分配内存

大小(size)和容量(capacity)之间的关系使我们能够预知什么时候插入操作会导致重分配内存

条款15:注意string实现的多样性

string的值可能会被引用计数,也可能不会,很多实现在默认情况下使用引用计数技术
string对象大小的范围可以是一个 char* 指针的大小的1倍到7倍
不同的实现对字符内存的分配有不同的策略

条款16:了解如何把 vector、string数据传给旧的 c—style API

当需要vector容器首地址时(C API常常需要数组首地址)应该使用 &v[0],而不是v.begin() (begin()返回的是指向容器第一个元素的迭代器)
当需要 char* 时,使用 str.c_str();

标准STL容器与C API转换(利用vector容器与数组内存布局的兼容性)
(1) C API 转到 STL容器

size_t fillArray(double* pArray, size_t arraySize);
vector<double> vec(maxNum); vec.resize(fillArray(&v[], vd.size() )); //将 C array数据拷贝到 vector容器
deque<double> d(vec.begin(), vec.end()); //将 C array数据拷贝到 deque容器
list<double> l(vec.begin(), vec.end() ); //将 C array数据拷贝到 list容器
set<double> s(vec.begin(), vec.end() ); //将 C array数据拷贝到 set容器

(2)STL容器 转到 C API

set<double> s;
vector<double> vec(s.begin(), s.end());
void func(&s[], s.size());
条款17:使用"swap技巧"除去多余的容量

vector容器只会自动扩充内存,不会自动缩减
为了避免容器占用不再需要的内存,可以显示地从容器中去除多余的容量:

vector<Widget> vec;
vector<Widget>(vec).swap(vec);

表达式 vector<Widget>(vec) 创建一个临时变量,这个变量是 vec变量的拷贝,相当于: vector<Widget> temp(vec);
临时变量的拷贝是由拷贝构造函数完成的,因为 拷贝构造函数只为所拷贝的元素分配所需要的内存,所以临时变量之中含有vec中size()个元素,没有多余容量
然后对这个临时变量调用swap,临时变量变成原vec(有多余容量),vec变成原临时变量(无多余容量)
语句末尾swap之后的临时变量(有多余容量)被析构,从而释放了原vec中多余的容量,而现vec中无多余容量

同样技巧对string同样适用:

string str;
string(str).swap(str);

注:swap之后,不仅两容器中的元素被交换,同时它们的迭代器、指针、引用全被交换

条款18:避免使用 vector<bool>

vector<bool>是个假容器,并不真的存储 bool,真正存储的是 bool 的紧凑表示,实际上每个 bool 仅占一个二进制bit位,而不是一个字节
应该使用 bitset 替代

STL学习笔记(二) vector和string的更多相关文章

  1. 【stl学习笔记】vector

    vector是定义于namespace std内的template: namespace std { template<class T, class Allocator = allocator& ...

  2. Effective STL 学习笔记: 多用 vector & string

    Effective STL 学习笔记: 多用 vector & string 如果可能的话, 尽量避免自己去写动态分配的数组,转而使用 vector 和 string . 原书作者唯一想到的一 ...

  3. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  4. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  5. muduo学习笔记(二)Reactor关键结构

    目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...

  6. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  7. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  8. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  9. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

随机推荐

  1. 使用ABAP编程实现对微软Office Word文档的操作

    SAP ABAP里提供了一个标准的类CL_DOCX_DOCUMENT,提供了本地以".docx"结尾的微软Office word文档的读和写操作. 本文介绍了ABAP类CL_DOC ...

  2. Linux Device Driver 学习(1)

    Linux Device Driver 学习(1) 一.搭建虚拟机开发环境 1.选择虚拟机VirtualBox,官网下载.deb包安装: VirtualBox Linux 5.1.6 下载fedora ...

  3. 机器学习之 PCA (二)

    参考  http://www.cnblogs.com/frombeijingwithlove/p/5931872.html

  4. 如何让浏览器关闭后session失效

    llzzcc66 知道合伙人数码行家 推荐于2018-08-10   如果用户不点击网站的“退出”链接,而直接关闭浏览器(或者强制关闭浏览器进程.死机等),服务器无法处理用户退出网站的请求,解决方式如 ...

  5. Vue的elementUI实现自定义主题

    使用vue开发项目,用到elementUI,根据官网的写法,我们可以自定义主题来适应我们的项目要求,下面来介绍一下两种方法实现的具体步骤,(可以参考官方文档自定义主题官方文档),先说项目中没有使用sc ...

  6. CPP-基础:strcpy之于C++(

    以下对strcpy函数错误的是? char atr1[]="string"; ]; char *str3; char *str4="sting"; A.strc ...

  7. nyoj-47-过河问题|POJ-1700-Crossing River

    http://acm.nyist.net/JudgeOnline/problem.php?pid=47 http://poj.org/problem?id=1700 解题思路:求最少需要多少时间才能都 ...

  8. idea Please specify commit message

    在idea中使用github来进行版本控制的时候, 当点击提交的时候遇到了这个问题 错误: Please specify commit message 解决方法: 在commit message中填写 ...

  9. PAT (Advanced Level) Practise - 1097. Deduplication on a Linked List (25)

    http://www.patest.cn/contests/pat-a-practise/1097 Given a singly linked list L with integer keys, yo ...

  10. jQuery-AJAX简介

    AJAX是浏览器后台与服务器交换数据的技术,无须加载整个页面的情况下,对页面中的局部进行更新. AJAX=异步的JavaScript与XML(Asynchronous JavaScript and X ...