Effective_STL 学习笔记(三十) 确保目标区间足够大

算法章:

1. 演示一些比较少见的算法使你的生活变得简单

2. 演示怎么避免算法常见的问题

STL 容器插入对象会出现的问题:

1   int transmogrify( int x );  // 这个函数从 x 产生一些新值
2   vector<int> values;
3   . . .              // 把数据放到 values
4   vector<int> results;  
5   transform( values.begin(), values.end(), results.end(), transmogrify ); 
6    // 把transmogrify应用于 values 中的每个对象,把这个返回的 values 附加到 results

出现的问题:transform 被告知它的目的区间是从 results.end() 开始的,

而 *results.end() 没有对象,所以不存在对象的赋值

把 transform 的结果放入叫作 results 容器的结尾的方式是调用 back_insert 来指定目标区间起点的迭代器

1   vector<int> results;
2   transform( values.begin(), values.end(), back_inserter(results), transmogrify );

back_inserter 返回的迭代器会调用 push_back(任何标准序列容器:vector、string、deque和list)

front_inserter 利用了 push_front(deque 和 list),在容器的前端插入

inserter 允许在容器的任意位置插入

1   inserter( results, results.begin() + result.size() / 2 );

无论何时使用一个要求指定目的区间的算法,确保目的区间已经足够大或者在算法执行时可以增加大小。

如果选择增加大小,就使用插入迭代器

比如 ostream_iterator 或从 back_inserter、front_inserter 或 inserter 返回的迭代器

原文地址:https://www.cnblogs.com/kidycharon/p/10034213.html