我有一个传递对象的方法,通过在循环中匹配其地址在指针向量中找到该对象,并且需要从向量中删除匹配的项而不删除该项(即该项仍需要存在于内存中) )。当前,这是方法:

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是需要删除的对象,而armySoldier指针的向量。 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()效率更高,但是元素的顺序会受到影响。

10-07 23:36