连续删除矢量元素

时间:2015-06-25 10:53:40

标签: c++ vector stl

如果这些元素相等,我需要从向量a和b中删除元素。据我所知,当我删除一个元素时,其他元素会移动。因此,[1]成为[0],[2] - a [1],依此类推。但我的代码不能正常工作:

#include <iostream>
#include <vector>

using namespace std;

bool remove(vector<int>& a, vector<int>& b){

     for (size_t i = 0; i < a.size(); ++i )
     {

      while ( true )
      {
          std::vector<int>::iterator it;
          it = std::find(b.begin(), b.end(), a[i]);
          if ( it != b.end() )
          {
              i = 0; //because of moving elements
              b.erase(b.begin()+i); 
              a.erase(a.begin()+i);
              break; 
          }

      }
    }
    return true;
}

int main(){
    vector<int> a;
    vector<int> b;

    a.push_back(1);
    a.push_back(2);
    a.push_back(3);

    b.push_back(1);
    b.push_back(2);
    b.push_back(3);

    remove(a,b);

    return 0;
}

问题是 - 最后一个相等的元素保留,所以我无法删除它们。我如何解决这个问题,考虑到不等元素可以在向量的中间:a = 1,2,3;来自载体a的b = 1,3,3-2不应该被删除吗?

1 个答案:

答案 0 :(得分:4)

  

据我所知,当我删除一个元素时,其他元素就会移动。

这是部分正确的。如果删除元素,则之后的元素会被向下推以填充该洞。如果删除第5个元素,则第6个元素的元素现在变为第5个元素。但第四个元素仍然排在第四位。只有之后才能删除。所以你的代码是:

i =  // the element from a
it = // the iterator pointing to an element from b

i = 0;
b.erase(b.begin()+i); // erase the 1st element from b
a.erase(a.begin()+i); // erase the 1st element from a

你完成所有这些工作以找到一对相等的元素,然后立即丢弃它 - 擦除两个向量的前面元素。这就是为什么它不起作用。您想要删除找到的元素:

b.erase(it);
a.erase(a.begin() + i); // no i = 0

请注意,如果要删除其他数组中匹配的每个元素,则此修补程序不会删除它 - 如果1中有两个a,但b中只有一个for (std::vector<int>::iterator itA = a.begin(); itA != a.end(); /* nothing */) { std::vector<int>::iterator itB = std::find(b.begin(), b.end(), *itA); if (itB == b.end()) { // done with this element, move on ++itA; } else { // erase EVERYTHING b.erase(std::remove(itB, b.end(), *itA), b.end()); itA = a.erase(std::remove(itA, a.end(), *itA), a.end()); } } {1}}你永远不会删除第二个。为此,我们需要利用Erase-remove idiom

RedisSession