/ / std :: list iterator.erase () powoduje niepoprawny wskaźnik - c ++, c ++ 11

std :: list iterator.erase () powoduje niepoprawny wskaźnik - c ++, c ++ 11

Cześć, mam problem z std::list gdzie dostaję free(): nieprawidłowy błąd wskaźnika po wywołaniu kasowaniafunkcja, a następnie iteruj do tego elementu. Miałem nadzieję, że pominie ten element, ponieważ został usunięty ... Moim pierwszym założeniem było być może potrzebujesz nowego iteratora, ponieważ poprzedni jest nieaktualny. Więc moim rozwiązaniem było ustawienie mojego iteratora list.begin() a następnie posuwać się naprzód. To jednak nadal powoduje błąd.

Próbuję ustawić element na liście na element, który jest n spacji do przodu. Następnie usuń element, który jest n spacji do przodu.

#include "roulette.h"
#include <iostream>

uint roulette(uint people, uint step)
{
std::list<uint>::iterator iterator;
uint position = 0;

for(uint i = people; i > 0; i--)
gl_myList.push_front(i);

iterator = gl_myList.begin();
while(people > 1)
{
for(uint i = 0; i < step - 1; i++)
{
position++;
iterator++;
if(iterator == gl_myList.end())
{
iterator = gl_myList.begin();
position = 0;
}
}
*iterator = kill(iterator, step);

/*
* This was my attempt to fix it
iterator = gl_myList.begin();
advance(iterator, position);
*/

people--;
}

return *iterator;
}

#include "roulette.h"
#include <iostream>
uint kill(std::list<uint>::iterator iterator, uint step)
{
uint value;
for(uint i = 0; i < step; i++)
{
iterator++;
if(iterator == gl_myList.end())
iterator = gl_myList.begin();
}
value = *iterator;
gl_myList.erase(iterator);
return value;
}

Odpowiedzi:

2 dla odpowiedzi № 1

Może coś takiego:

std::list<uint>::iterator advanceList(std::list<uint>::iterator start, int step) {
for(uint i = 0; i < step; i++) {
start++;
if(start == gl_myList.end())
start = gl_myList.begin();
}
return start;
}

I w twoim głównym kodzie:

while(people > 1) {
iterator = advanceList(iterator, step);
auto tmpIterator = advanceList(iterator, step-1);
*iterator = *tmpIterator;
iterator = gl_myList.erase(tmpIterator);

people--;
}

2 dla odpowiedzi nr 2

Kiedy twój kill funkcja zwraca, próbujesz przypisać wartość zwracaną do *iterator - ale unieważniłeś iterator kill!