3

次のコードで何が間違っているのか教えてください。2 番目のベクトルの値 >= 80 が期待されますが、空です。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Tester
{
    public:
        int value;
        Tester(int foo)
        {
            value = foo;
        }
};

bool compare(Tester temp)
{
    if (temp.value < 80)
        return true;
    else
        return false;
}

int main()
{
    vector<Tester> vec1;
    vector<Tester> vec2;
    vec1.reserve(100);
    vec2.reserve(100);

    for(int foo=0; foo<100; ++foo)
        vec1.push_back(Tester(foo));

    remove_copy_if(vec1.begin(), vec1.end(), vec2.begin(), compare);

    cout<< "Size: " << vec2.size() << endl;

    cout<< "Elements"<<endl;
    for(int foo=0; foo < vec2.size(); ++foo)
        cout << vec2.at(foo).value << " ";
    cout<<endl;

    return 0;
}
4

2 に答える 2

6

この関数std::remove_copy_if()は、一致しない要素をあるシーケンスから別のシーケンスにコピーします。呼び出し

remove_copy_if(vec1.begin(), vec1.end(), vec2.begin(), compare);

で始まる適切なシーケンスがあると仮定しますが、vec2.begin()実際にはそうではありません: 何もありません。メモリreserve()dがない場合vec2は、おそらくクラッシュするでしょう。必要に応じてシーケンスを展開するイテレータが必要です。

std::remove_copy_if(vec1.begin(), vec1.end(), std::back_inserter(vec2), compare);

これにより、への呼び出しreserve()は必要ありませんが、潜在的なパフォーマンスの最適化のみが必要です。

于 2012-08-20T23:50:56.730 に答える
4

標準アルゴリズムはイテレーターで機能し、それらのイテレーターが属するコンテナーについては何も知りません。vec2.begin()出力反復子パラメーターとして渡したところ、それが空でremove_copy_ifあることを知らずに盲目的にインクリメントされ、割り当てられたスペースが不足します。呼び出しの前に、ベクトルを適切なサイズにvec2渡すか、サイズを変更する必要があります。back_insert_iterator

于 2012-08-20T23:51:28.053 に答える