我编写了这个函数,它应该按升序合并两个向量而不重复。函数应该返回结果向量,但是当我尝试显示它时,虽然显示函数适用于其他向量,但没有任何反应。我也没有得到任何错误,所以它就像结果向量一样空。我正在尝试学习迭代器,这是第一次使用它们,所以也许我误解了这个概念。这是代码:
vector<int> sort(vector<int> &a, vector<int> &b){
vector <int> sorted;
for (vector<int>::iterator it = a.begin(); it != a.end();) {
for (vector<int>::iterator it2 = b.begin(); it2 != b.end();) {
if (*it < *it2){
sorted.push_back( *it);
++it2;
}
else if (*it >*it2){
sorted.push_back(*it2);
++it;
}
else if (*it == *it2){
sorted.push_back(*it);
++it;
++it2;
}
}
}
return sorted;
}
我错误地使用了迭代器吗?任何帮助都非常感谢。
答案 0 :(得分:2)
std::set_union
中定义的 <algorithm>
可以满足您的需求。请参阅here以供参考。在&#34;可能的实施&#34;你可以找到一个有效的实施方案。
答案 1 :(得分:1)
您的代码存在一些问题 - 首先,您使用的是分配而不是比较(即=
而不是==
)。
然而,更重要的是,您的合并算法是错误的:它使用两个嵌套循环而不是具有AND-ed条件的单个循环,只有在两个向量中的一个用完元素之前,它才能正常工作。一旦发生这种情况,两个循环都会停止,所以&#34;尾部&#34;其中一个载体将保持未合并状态。
正确的算法如下所示:
while (it != a.end() && it2 !=b.end()) {
... // Do the merge
}
while (it != a.end()) {
... // Push back a's tail
}
while (it2 != b.end()) {
... // Push back b's tail
}
请注意,此解决方案中没有嵌套循环 - 三个循环连续运行。另请注意,这三个循环中最多有两个循环运行;第二个或第三个循环将为空。
注意:显然,这看起来像是一次学习练习;如果不是,更好的方法是使用标准C ++库中的std::merge
。
答案 2 :(得分:0)
为什么你不只是将两个向量的所有元素都按顺序推送,并且在使用sort()函数之后呢? 尝试调试:
std::cout << *it << " and " <<*it2 << endl;
编辑:尝试:
sort( vec.begin(), vec.end() );
vec.erase( unique( vec.begin(), vec.end() ), vec.end() );
请参阅此帖子了解更多详情:
What's the most efficient way to erase duplicates and sort a vector?