2

当我用 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;
}
4

2 回答 2

3

的目标范围std::transform必须足够大以容纳结果。你v2是一个空向量。您可以在调用v2.resize()之前调用std::transformback_inserter像这样使用:

transform(v.begin(),v.end(),back_inserter(v2),change);
于 2013-08-01T23:41:42.617 回答
3

您的第二个集合是空的 - 要将项目插入其中,您需要使用 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按原样执行时它都不起作用):您有未定义的行为试图访问其当前范围之外的向量。因此,任何行为都是允许的。在实际调用 UB之前,通常很难看出程序中的 UB 如何影响代码的行为,但标准非常明确地允许这样做。一些编译器利用这一点来启用(例如)原本不可能(或可能不可能)的优化。

于 2013-08-01T23:43:07.213 回答