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

2 番目のコレクションは空です。項目を挿入するには、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入力の各項目に 1 つ追加することだけが本当に必要な場合は、そのコードを自分で記述する代わりに、次のようなものを使用する方が簡単な場合があります (または、C++11 が利用可能な場合は、ラムダを使用できます)。 )。

あなたが実際に尋ねた質問に答えるために(なぜあなたがtransformそれをやったときに実際にうまくいかないのか):現在の境界外のベクトルにアクセスしようとする未定義の動作がありました。そのため、あらゆる動作が許可されます。UB が実際に呼び出される前に、プログラムの後半で UB がコードの動作にどのように影響するかを確認するのは少し難しいことがよくありますが、標準はそれを許可することを明確に示しています。一部のコンパイラはこれを利用して、他の方法では不可能な (または可能でない可能性がある) 最適化 (たとえば) を有効にします。

于 2013-08-01T23:43:07.213 に答える
3

の宛先範囲はstd::transform、結果を保持するのに十分な大きさである必要があります。あなたv2は空のベクトルです。呼び出すv2.resize()前に呼び出すstd::transformか、back_inserter次のように使用できます。

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