当我用std::transform取消注释行时,上面的for_each将不会输出任何内容。下面的for_each也不会显示任何内容。我认为代码将从v中获取元素,增加它们并将其插入v2。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(const int& what){
cout<<what<<" ";
}
int change(const int& from){
return from+1;
}
int main() {
vector<int> v(5,10);
vector<int> v2;
for_each(v.begin(),v.end(),print);
//transform(v.begin(),v.end(),v2.begin(),change);
for_each(v2.begin(),v2.end(),print);
return 0;
}
最佳答案
您的第二个集合为空-要向其中插入项目,您需要使用std;:back_inserter:
transform(v.begin(), v.end(), back_inserter(v2), change);
但是请注意,这里的
for_each
也不是最佳选择。如果您要使用标准算法,建议您复制到ostream_iterator
:copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
transform(v.begin(), v.end(), back_inserter(v2));
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
如果您真正想做的就是在输入中的每一项中添加一个,则可能会发现使用
std::plus
之类的代码比为自己编写该代码更容易(或者,如果您有C++ 11,则可以使用lambda)。要回答您实际提出的问题(为什么当您按原样执行
transform
时,它们却没有真正起作用):您有未定义的行为,试图在 vector 的当前范围之外访问 vector 。因此,任何行为都是允许的。通常很难看清程序后面的UB在实际调用UB之前如何影响代码的行为,但是该标准对此非常明确。一些编译器利用此功能来启用(否则)不可能(例如)的优化(例如)。关于c++ - 带转换的for_each的异常行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18006413/