当我用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/

10-14 05:30