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));

}

当我运行这些测试时,第一个测试通过,但第二个测试返回向量中数字 1 的 0 个实例,其中答案应该是 1 个实例。

4

1 回答 1

6

问题是std::set_union需要对输入数据进行排序,而您v1的不是。

编辑:如评论中所述,您不应该预先调整向量的大小,因为它会以一堆 0 结束,除非您在联合结果中正好有 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 回答