3

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

  1. 从它所在的位置删除它,即让矢量调整大小
  2. 将要删除的元素与最后一个元素交换 st pop_back() 可以使用(我希望不涉及复制周围的所有内容......)

对于(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;
}
4

3 回答 3

8

标准的remove+erase习惯用法按值删除元素:

#include <vector>
#include <algorithm>

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

remove重新排序元素,使所有的擦除都在末尾,并返回一个迭代器到擦除范围的开头,并erase实际从容器中删除元素。

这与使用连续存储容器(如 )一样有效vector,特别是如果您有多个相同值的元素在一次清洗中全部被删除。

于 2011-10-23T21:43:54.257 回答
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;
    }
  }
}

但是,如果顺序无关紧要,为什么不只使用 a std::set

于 2011-10-23T21:02:51.237 回答
1

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

就是erase这样。

将要删除的元素与最后一个元素交换 st pop_back() 可以使用(我希望不涉及复制周围的所有内容......)

就是这样remove做的,只是它保留了剩余对象的顺序,因此它确实涉及复制周围的所有内容。

你所做的可以写成:

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

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

于 2011-10-23T20:57:31.710 回答