在C ++中,如何从向量中删除元素?
对于(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;
}
答案 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
的所有项,而不仅仅是第一个。