合并矢量

时间:2014-04-06 13:50:53

标签: c++ iterator

我编写了这个函数,它应该按升序合并两个向量而不重复。函数应该返回结果向量,但是当我尝试显示它时,虽然显示函数适用于其他向量,但没有任何反应。我也没有得到任何错误,所以它就像结果向量一样空。我正在尝试学习迭代器,这是第一次使用它们,所以也许我误解了这个概念。这是代码:

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

我错误地使用了迭代器吗?任何帮助都非常感谢。

3 个答案:

答案 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?