我有一个传递给对象的方法,通过在一个循环中匹配其地址在指针向量中找到该对象,并且需要从向量中删除匹配的项目而不删除该项目(即,该项目还需要存在于内存中)。当前,这是方法:
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'”。我如何在不使用迭代器的情况下解决此问题(没有新的,删除或开始的方法)?
答案 0 :(得分:4)
您可以将要擦除的元素与最后一个交换,并使用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()
效率更高,但是元素的顺序会受到影响。
答案 1 :(得分:0)
如果您查看std::vector::erase
的声明,则为:
iterator erase( const_iterator pos );
如您所见,该参数是一个插入器。您正在尝试传递一个整数作为参数。这样,重载解析不会找到您要传递的参数类型的重载。这就是错误“没有匹配的成员函数来调用'erase'” 的意思。
不使用迭代器就无法使用std::vector::erase
。
在不使用迭代器的情况下如何解决此问题
您可以使用最后一个元素覆盖要删除的元素,然后调用pop_back
删除重复的元素。两者都不需要迭代器即可完成。
如果要保持erase
的顺序,请用下一个覆盖目标元素。然后用下一个覆盖下一个,依此类推,直到向量结束。然后pop_back
。也就是说,我建议您使用迭代器和erase
来代替。无需通过任意禁止迭代器来使程序复杂化。