在C++中,从向量中弹出特定元素。

26
假设我有一个向量v,它有三个元素:{1,2,3}
有没有一种特定的方法可以从向量中弹出2,使得结果向量变为{1,3}
5个回答

43
//erase the i-th element
myvector.erase (myvector.begin() + i);

(将向量中的第一个元素计数为i = 0)


是的,但如果你想按元素而不是位置删除呢?例如在Python中,如果列表中有一个元素x,你可以使用pop(x)来弹出它,而不管它在列表中的位置如何。 - kamikaze_pilot
3
你确定可以使用Python列表来完成这个任务吗? - Benjamin Lindley
4
在Python中,pop按索引删除一个项目(Todd的回答),而remove按值删除一个项目(我的回答)。 - Ken Bloom

26
假设您正在寻找包含值2的元素,而不是索引2处的值。


#include<vector>
#include<algorithm>

int main(){
   std::vector<int> a={1,2,3};
   a.erase(std::find(a.begin(),a.end(),2));
}

我使用了 C++0x 来避免某些样板代码,但实际上使用 std::findvector::erase 并不需要 C++0x。


3
最坏情况下的时间复杂度是O(n),也就是需要遍历整个向量。如果你有一个已排序的向量,可以尝试使用lower_bound函数。 - Xeo
1
如果在您的向量上按值查找元素是常见操作,那么应该使用std :: setstd :: unsorted_set - Ken Bloom

10

1
从C++20开始,我们可以使用std::erase来删除多个元素。 (不需要使用“erase-remove idiom”)
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{1,2,2,3,4,5};
      
    std::erase(v, 2);
    
    for(auto e : v) std::cout << e << " ";
    std::cout << '\n';

    // output: 1 3 4 5
}

1
#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  unsigned int i;
  vector<unsigned int> myvector;

  // set some values (from 1 to 10)
  for (i=1; i<=10; i++) myvector.push_back(i);

  // erase the 6th element
  myvector.erase (myvector.begin()+5);

  // erase the first 3 elements:
  myvector.erase (myvector.begin(),myvector.begin()+3);

  cout << "myvector contains:";
  for (i=0; i<myvector.size(); i++)
    cout << " " << myvector[i];
  cout << endl;

  return 0;
}

1
你从某个地方复制了这段代码。它是从哪里来的?--> http://www.cplusplus.com/reference/stl/vector/erase/ - karlphillip
1
这是一个糟糕的答案,Christo。看看 @Todd 只用了两行代码就完成了。 - karlphillip
1
@Jerry,也许我在评论中有点夸张了。但我仍然认为,没有解释就抛出代码不是一个好的答案,特别是当这段代码是从别人那里复制过来的时候。这是一个没有提到作者的复制/粘贴答案。 - karlphillip
@Karlphillip: 嗯,我完全同意这一点 - 只是发布一大块代码而没有解释很少有帮助。如果你可以避免不署名的情况下,没有归属代码并不影响其作为答案的质量(在我看来),但这是不礼貌的。我曾经用过一些我已经放置了很长时间的代码,并且迷失了它来自何方,但从未真正故意这样做。 - Jerry Coffin
1
@karlphillip:昨晚我也在考虑这个问题,但没机会。很高兴听到有人从中受益——很难猜测是否有人甚至注意到它的存在。我会尽力更经常地发布一些内容…… - Jerry Coffin
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接