从Vector中删除元素

时间:2011-10-23 20:52:23

标签: c++ vector erase

在C ++中,如何从向量中删除元素?

  1. 从它的位置删除它,即让矢量调整大小
  2. 使用最后一个元素s.t交换要删除的元素。可以使用pop_back()(我希望不会涉及复制所有内容......)
  3. 对于(1),我已经尝试过以下内容,但我不太确定它是否能完成它应该做的事情(删除传递给removeItem()的项目),它看起来并不优雅:

    vector<Item*> items;            
    // fill vector with lots of pointers to item objects (...)
    
    void removeItem(Item * item) {
        // release item from memory
        if (int i = getItemIdIfExists(item) != -1) {
            items.erase (items.begin()+i);
        }
    }
    
    int getItemIdIfExists(Item * item) {
        // Get id of passed-in Item in collection
        for (unsigned int i=0; i<items.size(); i++) {
            // if match found
            if (items[i] == item)     return i;  
        }
        // if no match found
        return -1;
    }
    

3 个答案:

答案 0 :(得分:8)

标准删除+擦除成语按值删除元素:

#include <vector>
#include <algorithm>

std::vector<int> v;
v.erase(std::remove(v.begin(), v.end(), 12), v.end());

remove重新排序元素,以便所有的擦除都在最后,并将一个迭代器返回到erasee范围的开头,erase实际上从容器中删除了元素。

这与使用vector这样的连续存储容器一样高效,尤其是如果您有多个具有相同值的元素,一次性清除所有元素都会被清除。

答案 1 :(得分:2)

void removeItem(Item*item){
  for(int i=0; i<items.size(); i++){
    if (items[i]==item){
      swap(items[i], items.back());
      items.pop_back();
      return;
    }
  }
}

但是,如果订单无关紧要,为什么不使用std::set

答案 2 :(得分:1)

  

从它的位置删除它,即让矢量调整大小

这就是erase的作用。

  

用最后一个元素s.t交换要删除的元素。可以使用pop_back()(我希望不会涉及复制所有内容......)

这就是remove的作用,除了它保留剩余对象的顺序,因此它涉及复制周围的所有内容。

你所做的可以写成:

items.erase(
    std::remove(
        items.begin(), items.end()
      , item
    )
  , items.end()
);

与您的代码的不同之处在于,它实际上会删除值为item所有项,而不仅仅是第一个。