3

このコードに問題があり、コードをコンパイルしていますが、ベクターの内容をテストしようとすると、テストが失敗します。コードは次のとおりです。

using std::vector;

// returns a different vector, containing all elements in v1 and all elements in v2                          (elements who are either in v1 or v2) but no duplicates.

template <typename T> vector<T> set_union(const vector<T>& v1, const vector<T>&v2)
{
    vector<T> v(20);
    typename vector<T>::iterator it;

    it = set_union (v1.begin(), v1.end(), v2.begin(), v2.end(), v.begin());
    return v;
}

そして、ここに私が実行しているテストがあります:

TEST_F(MyTest,set_union) {
        vector<int> v1{1,3,2};
        vector<int> v2{1,4};
        vector<int> v=set_union(v1,v2);
        ASSERT_EQ(0,count(v,9));
        ASSERT_EQ(1,count(v,1));
        ASSERT_EQ(1,count(v,2));
        ASSERT_EQ(1,count(v,3));
        ASSERT_EQ(1,count(v,4));

}

これらのテストを実行すると、最初のテストはパスしますが、2 番目のテストではベクトル内の数値 1 のインスタンスが 0 個返されます。答えは 1 インスタンスである必要があります。

4

1 に答える 1

6

問題はstd::set_union、入力データをソートする必要があることですが、そうでv1はありません。

編集: コメントに記載されているように、結合された結果に正確に 20 個のアイテムがない限り、ベクターのサイズを事前に設定しないでください。代わりに、次のようなものはどうですか (名前をよりわかりやすいものに変更し、コメントに基づいて最小サイズの境界を予約するために呼び出しで忍者編集しました):

template <typename T>
std::vector<T> vector_union(const std::vector<T>& v1, const std::vector<T>& v2)
{
    vector<T> v;
    v.reserve(std::max(v1.size(), v2.size());

    set_union (v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v));

    return v;
}

必要に応じて、呼び出す前にベクトルをソートすることもできますがset_union、事前にソートされた入力に対して不要な作業が発生します。

于 2012-10-12T14:36:14.860 に答える