Использование Set Iterator в C ++ - PullRequest
3 голосов
/ 15 декабря 2009

Когда я пытаюсь использовать итератор наборов в режиме отладки в C ++, я получаю сообщение об ошибке: «map / set iterator not dereferencable». Я не понимаю, потому что я думал, что разыменование - это то, как вы должны использовать итератор. Код выглядит так:

set<int>::iterator myIterator;
for(myIterator = mySet.begin();
    myIterator != mySet.end();
    myIterator++)
    DoSomething(*myIterator)

Это формат всех примеров, которые я видел в Интернете о том, как использовать итераторы. Что я делаю не так?

Ответы [ 4 ]

7 голосов
/ 15 декабря 2009

Если DoSomething() меняет набор - удаляет или вставляет элементы, то удерживаемый итератор становится недействительным, что, вероятно, приведет к этой ошибке.

2 голосов
/ 15 декабря 2009

Первая и самая большая вещь, которую вы делаете неправильно, - это написание такого кода вообще. То, что у вас есть выше, является написанным вручную эквивалентом:

std::for_each(mySet.begin(), mySet.end(), DoSomething);

Существует относительно немного действительно хороших применений итераторов вне реализации алгоритмов. Время от времени это разумно с картой или мультикартой (или unordered_ [multi] map), но это в основном компенсирует карту и мультикарту с использованием std :: pair, что не совсем замечательно.

1 голос
/ 15 декабря 2009

Этот вопрос был основан на ложной предпосылке. Я увидел ошибку «итератор карты / набора, не разыменованный» и подумал, что это общее утверждение, которое применяется ко всем итераторам карты / набора, что, как я сказал, не имеет никакого смысла. Но я снова посмотрел, и настоящая проблема заключалась в том, что указатель, который я использовал для доступа к этому итератору, был недействительным.

1 голос
/ 15 декабря 2009

Эта ошибка обычно означает, что вы обращаетесь к итератору end ().

...