Effective STL 学习笔记 Item 30: 保证目标区间足够大

*/-->

div.org-src-container {
font-size: 85%;
font-family: monospace;
}
p {font-size: 15px}
li {font-size: 14px}

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);

最新文章

  1. jQuery图片延迟加载
  2. 使用 ServiceStack 构建跨平台 Web 服务
  3. JDBC事务处理
  4. Java之重载与覆盖
  5. 【leetcode❤python】Binary Watch
  6. CodeForces 219B Special Offer! Super Price 999 Bourles!
  7. Java 分割文件 注意事项
  8. 十六进制转十进制 - C
  9. inter
  10. struts2中获取request、response,与android客户端进行交互(文件传递给客户端)
  11. Java经典编程题50道之三十五
  12. Kali 无法正常上网问题
  13. Linux 中磁盘容量配额
  14. 常见问题一之拼接表格 js传递参数变量 Json接收值
  15. 吐槽下mac的打印机设置
  16. 【Linux】使用w命令和uptime命令查看系统负载
  17. SSM_CRUD新手练习(1)创建项目
  18. Webpack 学习笔记总结
  19. 【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游
  20. 微信小程序-自定义底部导航

热门文章

  1. C中有关引用和指针的异同
  2. [python]python安装包错误
  3. 利用ansible来做tomcat应用的持续交付
  4. GoWeb_01:GoWeb基础之mac上mysql安装
  5. CODEVS 2171 棋盘覆盖
  6. Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
  7. oracle改进之将阿拉伯数字转换成中文数字
  8. MESS-配置
  9. java 修饰符总结
  10. ASP.NET CORE API Swagger+IdentityServer4授权验证