Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大
*/-->
div.org-src-container {
font-size: 85%;
font-family: monospace;
}
p {font-size: 15px}
li {font-size: 14px}
Table of Contents
1 容器区间与算法
STL 容器吸引人的地方之一在于它能够自动管理内存,在有新的元素插入时候(通过 push_back(),
push_front(), insert() )可以自动分配空间。但要注意的是,如果新的元素不是通过上述的 navive
method 加进来的话,容器不会自动分配内存,例如下面的代码:
1: int transmogrify(int x); // this function produces some new value from x.
2: vector<int> values;
3: vector<int> results
4:
5: transform(values.begin(), values.end(), results.end(), transmogrify);
这里有两个问题:
- 第五行代码会直接向 results 的尾部写入数据,而尾部的内存未知,会引发问题
- 直接的操作不会改变容器内部记录的 size & capacity ,从而破坏的容器。
2 back_inserter
我们应该想办法调用 push_front,push_back or insert 来插入数据:
int transmogrify(int x); // this function produces some new value from x.
vector<int> values;
vector<int> results transform(values.begin(), values.end(), back_inserter(results), transmogrify);
3 front_inserter
如果上面的代码中使用的是可以双向插入数据的容器( deque or list ),还可以使用
push_front :
1: int transmogrify(int x); // this function produces some new value from x.
2: list<int> values;
3: list<int> results
4:
5: transform(values.begin(), values.end(), front_inserter(results), transmogrify);
上面的代码还有个问题,由于每个数据都会被插到头部,实际上最后得到的 results 里面数据的顺序和
values 里面是相反的,我们可以反向遍历 values:
int transmogrify(int x); // this function produces some new value from x.
list<int> values;
list<int> results transform(values.rbegin(), values.rend(), front_inserter(results), transmogrify);
4 inserter
front_inserter & back_inserter 可以向前或者向后插入数据,而 inserter 则可以向任意位置插入数据:
int transmogrify(int x); // this function produces some new value from x.
vector<int> values;
vector<int> results transform(values.begin(), values.end(),
inserter(results, results.begin() + results.size()/2),
transmogrify);
5 inserter & reserve
Item 14 中提到过,vector 插入式数据可能会引起内存的重新分配,从而影响性能,对于前面的几个例子来说,我们可以预先算出插入新的数据后 vector 有多大,因此可以是所有 Item 14 中提到过的方法来优化:
int transmogrify(int x); // this function produces some new value from x.
vector<int> values;
vector<int> results result.reserve(result.size() + values.size());
transform(values.begin(), values.end(),
inserter(results, results.begin() + results.size()/2),
transmogrify);
(转载请注明出处,使用许可:署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 。)
Effective STL 学习笔记 Item 30: 保证目标区间足够大的更多相关文章
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...
- Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor
Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
- Effective STL 学习笔记 Item 17: Swap Trick
假设有若干对象存于一个 vector 中: class Widget; vector<Widget> vw; 后来由于某些原因,从该容器中删除了若干对象(参考erase-remove id ...
- Effective STL 学习笔记 Item 16:vector, string & C API
有时需要支持 C 的接口,但这并不复杂. 对于 vector 来讲, \(v[0]\) 的地址 \(\&v[0]\) 即可作为数组指针传递给 C API: 1: // Legacy C API ...
- Effective STL 学习笔记 Item 18: 慎用 vector<bool>
vector<bool> 看起来像是一个存放布尔变量的容器,但是其实本身其实并不是一个容器,它里面存放的对象也不是布尔变量,这一点在 GCC 源码中 vector<bool> ...
- [置顶] Effective STL 学习笔记
看Effective STL 作的一些笔记,希望对各位有帮助. 以下是50条条款及相关解释. 容器 1. 慎重选择容器类型,根据需要选择高效的容器类型. 2. 不要试图编写独立于容器类型的代码. 3. ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
随机推荐
- 使用EntitysCodeGenerate
http://bbs.csdn.net/topics/360256700 public DataSet xxx(DateTime start, DateTime end, string type) ...
- golang 安装一个项目下的所有依赖
go get -v ./...
- 用Anaconda安装本地python包
Anaconda确实带来了很多方便,但是之前也过多的依赖了conda自带的一键下载python包的功能.这不,这几天突然要用FastFM这个包,无奈conda里没有,于是只能从github下载下来,实 ...
- P2831 愤怒的小鸟
P2831 愤怒的小鸟 从 \((0, 0)\) 发射一只鸟, 轨迹满足抛物线, 问最少几只鸟可以打完 \(n <= 18\) 只猪 错误日志: 处理抛物线数组没有初始化 Solution 数据 ...
- python 套接字之select poll epoll
python下的select模块使用 以及epoll与select.poll的区别 先说epoll与select.poll的区别(总结) select, poll, epoll 都是I/O多路复用的具 ...
- Java消息队列三道面试题详解!
面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...
- HDU 3032 multi-sg 打表找规律
普通NIM规则加上一条可以分解为两堆,标准的Multi-SG游戏 一般Multi-SG就是根据拓扑图计算SG函数,这题打表后还能发现规律 sg(1)=1 sg(2)=2 sg(3)=mex{0,1,2 ...
- java项目中Excel文件预览
package com.linkonworks.df.busi.utils; import java.io.File; import java.io.FileInputStream; import j ...
- IT人应当知道的10个行业小内幕
如果你打算从事IT行业或刚进入这个行业,也许本文下面的小内幕会吓到你,因为这些事平常都不会公开讨论的.如果你是IT资深人士,或许你已经遇到其中的大部分了.如果你愿意,请一起来参与讨论吧. 这些内幕大多 ...
- SVN自动更新-win平台
把项目给外包做,他们天天整个ftp传来传去,上传一次还要到处翻View和Controller,还有漏传的情况,简直low到不行.看不下去了,就准备整个svn.虽然svn解决了上传的问题,但是自动发布还 ...