Noo*_*oob 3 c++ iterator set-union
我对这段代码有一些问题,代码正在编译,但是当我尝试测试向量的内容时,测试失败了.这是代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
这是我正在运行的测试:
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));
Run Code Online (Sandbox Code Playgroud)
}
当我运行这些测试时,第一个测试通过,但第二个测试返回向量中数字1的0个实例,其中答案应为1个实例.
问题是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;
}
Run Code Online (Sandbox Code Playgroud)
如果需要,您甚至可以在调用之前对这些向量进行排序,set_union但这会导致预先排序的输入不需要的工作.
| 归档时间: |
|
| 查看次数: |
600 次 |
| 最近记录: |