作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用这段代码时遇到了一些问题,代码正在编译,但是当我尝试测试 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/
我在使用这段代码时遇到了一些问题,代码正在编译,但是当我尝试测试 vector 的内容时,测试失败了。这是代码: using std::vector; // returns a different v
我是一名优秀的程序员,十分优秀!