перебрать карту и вызвать функцию, которая удаляет другие элементы, это карта - PullRequest
5 голосов
/ 05 июня 2011

У меня есть карта, которая определена в глобальной памяти. Я перебираю это, скажем, я в третьем элементе. теперь я вызываю другую функцию, которая генерирует свой собственный итератор для той же карты, однако она может стереть 4-й или 5-й ... элементы на карте. мой вопрос: когда я вернусь из этой функции и продолжу перебирать карту (напомню, я в третьем элементе), мой итератор может быть недействительным или это безопасно?

извините, я не могу прикрепить код, он очень очень длинный.

спасибо

EDIT: у меня вопрос примерно такой:

map<string,string> mapi;

void er() {
    mapi.erase("t");
} 

int main() {


mapi.insert(pair<string,string>("w","a"));
mapi.insert(pair<string,string>("e","a"));
mapi.insert(pair<string,string>("r","a"));
mapi.insert(pair<string,string>("t","a"));
mapi.insert(pair<string,string>("A","a"));
mapi.insert(pair<string,string>("u","a"));
mapi.insert(pair<string,string>("C","a"));

map<string,string>::iterator it;
for (it=mapi.begin(); it!=mapi.end(); it++) {
    cout << it->first << endl;
    if (it->first=="t")
        er();
}

}

в этом случае я стираю тот же элемент - valgrind говорит, что это ошибка. Однако, когда я удаляю другие элементы, он, кажется, работает нормально.

1 Ответ

7 голосов
/ 05 июня 2011

С http://www.sgi.com/tech/stl/Map.html:

Стирание элемента с карты также не делает недействительными никакие итераторы, за исключением, разумеется, итераторов, которые фактически указывают на удаляемый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...