«Итератор стирания вектора вне диапазона» в C ++ - PullRequest
3 голосов
/ 26 ноября 2011

В этом коде C ++ я пытаюсь стереть элемент с конца вектора, но программа останавливается, и я получаю сообщение: Expression: vector erase iterator outside range.

В чем проблема? Ведь этим кодом является вектор-вектор указателей или способ, которым я передаю их в push_back, вставляет только копию указателя?

int _tmain(int argc, _TCHAR* argv[])
{
    vector<Player*> allPlayers;
    allPlayers = createPlayers();

    int numPlayers;

    cout<<"Vector size: "<<allPlayers.size();
    cout<<endl;
    cout<<"How many players are involved in the game(1-4)?\n";
    cin>>numPlayers;
    cout<<endl;
    allPlayers.erase(allPlayers.end());

    return 0;
}


vector<Player*> createPlayers(){

    Player *Player1 = new Player(1,1500);
    Player *Player2 = new Player(2,1500);
    Player *Player3 = new Player(3,1500);
    Player *Player4 = new Player(4,1500);


    vector<Player*> allPlayers;
    allPlayers.push_back(Player1);
    allPlayers.push_back(Player2);
    allPlayers.push_back(Player3);
    allPlayers.push_back(Player4);


    return allPlayers;
}

Ответы [ 2 ]

6 голосов
/ 26 ноября 2011

.end() возвращает итератор один за последним элементом .Вот почему вы получаете эту ошибку.Вы хотите, чтобы итератор указывал на последний элемент.Не пропустите последний элемент.

Поэтому попробуйте изменить строку на:

allPlayers.erase(allPlayers.end() - 1);

И убедитесь, что вы правильно обрабатываете случай, когда вектор пуст.


В качестве альтернативы вы можете использовать .pop_back(), но в любом случае вам захочется иметь дело с утечками памяти, а также упомянутыми в комментариях.

1 голос
/ 26 ноября 2011

Использовать pop_back функцию-член.Как уже было сказано, end не дает вам итератор для последнего элемента, а один после последнего элемента.

http://en.cppreference.com/w/cpp/container/vector/pop_back

Почему вы хотите создать указатели Player?

Измените код следующим образом:

В основном,

vector<Player> allPlayers;
createPlayers(allPlayers);

В функции createPlayers:

void createPlayers(vector<Player>& allPlayers)
{
    Player Player1(1,1500);
    Player Player2(2,1500);
    allPlayers.push_back(Player1);
    allPlayers.push_back(Player2);
    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...