我有一个传递对象的方法,通过在循环中匹配其地址在指针向量中找到该对象,并且需要从向量中删除匹配的项而不删除该项(即该项仍需要存在于内存中) )。当前,这是方法:
void remove(Soldier& soldier) {
for (size_t i = 0; i < armySize(); ++i) {
if (army[i] == &soldier) {
cout << army[i]->getName() << "is removed" << endl;
army.erase(i);
break;
}
}
}
其中
soldier
是需要删除的对象,而army
是Soldier
指针的向量。 if
语句有效,这意味着soldier
的地址与向量中的项目匹配。问题是我收到一条错误消息,提示“没有匹配的成员函数来调用'erase'”。在不使用迭代器的情况下(不使用new,delete或begin方法)如何解决此问题? 最佳答案
您可以将要擦除的元素与最后一个交换,并使用std::vector::pop_back()
:
if( i != army.size() - 1 )
std::swap( army[i], army.back() );
army.pop_back();
在您的情况下,如果您使用指针,则可以简单地覆盖:
army[i] = army.back();
army.pop_back();
此方法比调用
std::vector::erase()
效率更高,但是元素的顺序会受到影响。