- 论坛徽章:
- 0
|
入东西,你可以使用front_inserter。在内部,front_inserter利用了push_front,所以front_insert只和提供那个成
员函数的容器配合(也就是deque和list):
... // 同上
list<int> results; // results现在是list
transform(values.begin(), values.end(), // 在results前端
front_inserter(results), // 以反序
transmogrify); // 插入transform的结果
因为front_inserter用push_front把每个对象添加到results,results中的对象顺序会和values中对应的对象顺序相
反。这也是为什么front_inserter没有back_inserter那么常用的原因之一。另一个原因是vector不提供push_front,
所以front_inserter不能用于vector。
如果你要transform把输出结果放在results前端,但你也要输出和values中对应的对象顺序相同,只要以相反的
顺序迭代values:
list<int> results; // 同上
transform(values.rbegin(), values.rend(), // 在results前端
front_inserter(results), // 插入transform的结果
transmogrify); // 保持相对的对象顺序
front_inserter让你强制算法在容器前端插入它们的结果,back_inserter让你告诉它们把结果放在容器后端,有
点惊人的是inserter允许你强制算法把它们的结果插入容器中的任意位置:
vector<int> values; // 同上
...
vector<int> results; // 同上,除了现在
... // 在调用transform前
// results已经有一些数据
transform(values.begin(), values.end(), // 把transmogrify的
inserter(results, results.begin() + results.size()/2), // 结果插入
transmogrify); // results的中间
不管你是否使用了back_inserter、front_inserter或inserter,每次对目的区间的插入只完成一个对象。条款5解释
了对于连续内存容器(vector、string和deque)来说这可能很昂贵,但条款5的建议解决方法(使用区间成员函
数)不能应用于使用算法来完成插入的情况。在本例中,transform会对目的区间每次写入一个值,你无法改 |
|