STL学习笔记(二) vector和string
条款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的更多相关文章
- 【stl学习笔记】vector
vector是定义于namespace std内的template: namespace std { template<class T, class Allocator = allocator& ...
- Effective STL 学习笔记: 多用 vector & string
Effective STL 学习笔记: 多用 vector & string 如果可能的话, 尽量避免自己去写动态分配的数组,转而使用 vector 和 string . 原书作者唯一想到的一 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例
C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...
- muduo学习笔记(二)Reactor关键结构
目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
随机推荐
- 将从SQL2008 r2里备份的数据库还原到SQL2008中
从标题可以看出这是未解决上一篇遗留问题写的,现在我也不知道这个可不可以成功,方法似乎查到了一种,具体怎样还不清楚:而且,我想说的是“我踩雷了”. 这篇的主角是“Database Publishing ...
- 基于Vmware player的Windows 10 IoT core + RaspberryPi2安装部署
本文记录了基于Vmware Player安装Windows10和VS2015开发平台的过程,以及如何在RaspberryPi2.0上启动Windows10 IoT core系统,并通过一个简单的hel ...
- python 基础网络编程2
python 基础网络编程2 前一篇讲了socketserver.py中BaseServer类, 下面介绍下TCPServer和UDPServer class TCPServer(BaseServer ...
- tensorflowjs下载源文件到本地不能加载模型解决方案
大多数情况(非源文件错误)下载源文件到本地不能加载模型,那么你可能需要搭建一个本地WEB服务器. 1.安装apache或ngnix,可以参照这个博客 2.强烈推荐一个Chrome插件Web Serve ...
- Bootstrap历练实例:输入框组的大小
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 【动态规划】bzoj1044: [HAOI2008]木棍分割
需要滚动优化或者short int卡空间 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍 ...
- opencast 视频捕获代理 pyCA安装和功能实现
pyCA安装过程: 36 git clone https://github.com/opencast/pyCA.git 37 cd pyCA/ 41 yum install python-pycurl ...
- python爬虫基础08-selenium大全2/8-Chrome Webdriver启动选项
Selenium笔记(2)Chrome Webdriver启动选项 本文集链接:https://www.jianshu.com/nb/25338984 在Selenium中使用不同的Webdriver ...
- SpringBoot 多线程
Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中任务一般是非阻 ...
- PAT Basic 1018
1018 锤子剪刀布 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输 ...