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 返回的迭代器