好吧,所以我正在构建一个游戏,要求我能够添加和删除一个*Fighter对象。
我首先在这里声明成员变量战斗机
std::vector<Fighter*> fighter;
然后我像这样实现添加和删除:
void Game::AddFighter(Fighter* f) {
fighter.push_back(f);
}
void Game::RemoveFighter(Fighter* f) {
if ( std::find(fighter.begin(), fighter.end(), f) != fighter.end() )
{
fighter.erase(f); //Error here
}
}
在上面指示的行上,我得到错误
调用"擦除"时没有匹配的成员函数
我知道调用erase的成员必须是迭代器,但我不知道在我试图实现的上下文中如何做到这一点。我知道,如果添加了Fighter*
,上面的代码适用于检测Fighter*
——我如何使用erase()
函数?
您需要获取std::find()
返回的迭代器并将其传递给vector::erase()
,例如:
void Game::RemoveFighter(Fighter* f) {
auto iter = std::find(fighter.begin(), fighter.end(), f);
if ( iter != fighter.end() ) {
fighter.erase(iter);
}
}
或者:
void Game::RemoveFighter(Fighter* f) {
decltype(fighter)::iterator iter;
if ( (iter = std::find(fighter.begin(), fighter.end(), f)) != fighter.end() ) {
fighter.erase(iter);
}
}
在C++17或更高版本中可以重写为这样:
void Game::RemoveFighter(Fighter* f) {
if ( auto iter = std::find(fighter.begin(), fighter.end(), f); iter != fighter.end() ) {
fighter.erase(iter);
}
}
或者,如果您使用C++20或更高版本,则可以使用std::erase()
:
void Game::RemoveFighter(Fighter* f) {
std::erase(fighter, f);
}
您需要将迭代器传递给erase
:
if ( auto it = std::find(fighter.begin(), fighter.end(), f); it != fighter.end() )
{
fighter.erase(it); //No error here. If you use C++17.
}