本条款需要我们牢记的是:无论何时,如果所使用的算法(来自这个标准头文件)需要指定一个目标区间,那么必须确保目标区间足够大(用.reserve() or .resize()来do),或者确保它会随着算法的运行而增大,要在算法执行过程中增大目标区间,请使用插入型迭代器,比如back_iterator,front_iterator和inserter返回的迭代器。这些都是你需要记住的。
test codes1:(向容器vector中添加新的对象)
#include#include #include using namespace std; int transFunc(int x) { return x * x; } int main(void) { vector values{ 1,2,3 }; vector res; res.reserve(values.size() + res.size());//确保目标区间有足够的空间容纳算法结果 transform(values.begin(), values.end(), back_inserter(res), transFunc); //使用transform()函数将原容器values中的begin到end区间内的每一个elems传入transFunc函数的结果 //都(使用back_inserter)插入到res容器的尾部 cout << "after using back_inserter insert elems to the back of res: " << endl; for_each(res.begin(), res.end(), [](int v) {cout << v << "t"; }); cout << endl; return 0; }
运行结果:
解释:这里使用back_inserter函数,返回一个迭代器,该迭代器使用方法push_back()来做元素的插入工作,当然,只有支持push_back()方法的容器才能这么使用!(注意:若容器size不足了,这个push_back *** 作会让对应的容器进行自动扩容)
test codes2:(向容器list中添加新的对象)
#include#include #include using namespace std; int transFunc(int x) { return x * x; } int main(void) { list
values{ 1,2,3 }; list res; res.reserve(values.size() + res.size());//确保目标区间有足够的空间容纳算法结果 transform(values.begin(), values.end(), front_inserter(res), transFunc); cout << "after using front_inserter insert elems to the front of res: " << endl; for_each(res.begin(), res.end(), [](int v) {cout << v << "t"; }); cout << endl; return 0; }
运行结果:
解释:这里使用front_inserter函数,返回一个迭代器,该迭代器使用方法push_front()来做元素的插入工作,当然,只有支持push_front()方法的容器才能这么使用!(注意:若容器size不足了,这个push_front *** 作会让对应的容器进行自动扩容)
test codes3:(向容器list中添加新的对象)
#include#include #include using namespace std; int transFunc(int x) { return x * x; } int main(void) { list
values{ 1,2,3 }; list res; res.reserve(values.size() + res.size());//确保目标区间有足够的空间容纳算法结果 transform(values.begin(), values.end(),inserter(res,res.begin()), transFunc); cout << "after using inserter insert elems to the front of res: " << endl; for_each(res.begin(), res.end(), [](int v) {cout << v << "t"; }); cout << endl; return 0; }
运行结果:
解释:这里使用inserter函数,返回一个迭代器,该迭代器是用于把算法结果插入到容器中的特定的位置上的(比如这里就是插入到res的开始begin处)。
小总结:
1-使用front_inserter导致算法将结果插入到容器的头部 2-使用back_inserter导致算法将结果插入到容器的尾部 3-使用inserter导致算法将结果插入到容器中的指定位置(自定义)上
补充:如果你希望像transform这样的算法把Func的结果以新的元素之形式插入到容器中,你就必须使用到上述的3种插入迭代器之一(依据你所使用的容器而定)。
但有时,我只是希望简简单单地覆盖某个容器中已有的元素,而不是插入新元素的话,这种case下你就不需要插入迭代器了,但你仍然需要遵守本条款:确保目标区间的空间足够容纳算法的结果。
test codes4:(覆盖某个容器中已有的元素)
#include#include #include int transFunc(int x) { return x * x; } int main(void) { vector values{ 3,3,8 }; vector res; if (res.size() < values.size()) res.resize(values.size());//确保res至少和values一样大! //进而确保目标区间有足够大的空间去容纳原容器的data transform(values.begin(), values.end(), res.begin(), transFunc); cout << "after covering elems to the begin of res: " << endl; for_each(res.begin(), res.end(), [](int v) {cout << v << "t"; }); cout << endl; return 0; }
运行结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)