使用循环(而不是迭代器)从向量中删除指针

时间:2018-12-30 02:51:56

标签: c++ c++11 computer-science

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

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'”。我如何在不使用迭代器的情况下解决此问题(没有新的,删除或开始的方法)?

2 个答案:

答案 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来代替。无需通过任意禁止迭代器来使程序复杂化。