Alright, so I am building a game that requires that I am able to add and remove a *Fighter object.
I first declare member variable fighter here
std::vector<Fighter*> fighter;
I then implement Add and Remove like this:
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
}
}
On the line indicated above, Im getting the error
No matching member function for call to 'erase'
I understand that the member calling erase must be an iterator, however I don't know how to do that in the context of what I am trying to achieve. I know that the above code works for detecting a Fighter* if the Fighter* has been added - how do I use the erase() function?
CodePudding user response:
You need take the iterator returned by std::find() and pass it to vector::erase(), eg:
void Game::RemoveFighter(Fighter* f) {
auto iter = std::find(fighter.begin(), fighter.end(), f);
if ( iter != fighter.end() ) {
fighter.erase(iter);
}
}
Alternatively:
void Game::RemoveFighter(Fighter* f) {
decltype(fighter)::iterator iter;
if ( (iter = std::find(fighter.begin(), fighter.end(), f)) != fighter.end() ) {
fighter.erase(iter);
}
}
Which can be re-written as this in C 17 or later:
void Game::RemoveFighter(Fighter* f) {
if ( auto iter = std::find(fighter.begin(), fighter.end(), f); iter != fighter.end() ) {
fighter.erase(iter);
}
}
Alternatively, if you are using C 20 or later, you can use std::erase() instead:
void Game::RemoveFighter(Fighter* f) {
std::erase(fighter, f);
}
CodePudding user response:
You need to pass an iterator to 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.
}
