时间:2019-03-08 标签:c++set_unioniterator

标签 c++ iterator set-union

我在使用这段代码时遇到了一些问题,代码正在编译,但是当我尝试测试 vector 的内容时,测试失败了。这是代码:

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

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

最佳答案

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

编辑:如评论中所述,您不应该预先确定 vector 的大小,因为它会以一堆 0 结束,除非您在 union 结果中恰好有 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 之前对 vector 进行这种排序,但这会导致对预先排序的输入进行不必要的工作。

关于时间:2019-03-08 标签:c++set_unioniterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12861304/

相关文章:

c++ - 所有版本的 GCC 都在使用在定义中具有默认类型的模板

c++ - 基于范围的for循环的range_declaration中各个说明符之间的性能差异

c# - 使用 C++ 创建 Windows Phone 8 GUI

algorithm - 获取 M 排序集并集的前 N ​​项的最有效方法是什么

python - 如何在 Python 的集合列表中找到并集?

r - 三组或多组并集的概率

c++ - bool 数组在衰减方面的处理方式不同吗?

java - 是否可以在 Java 中扩展迭代器的功能?

rust - 为什么允许我对迭代器的可变引用调用 take() ?

C++ 嵌套模板类语法