2009-12-14 9 views
3

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

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

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

+0

Что такое DoSomething, объявленное как? – Glen

+3

Этот пример выглядит правдоподобным (запрет отсутствующего ';'). Вам нужно опубликовать что-то более полное, что фактически показывает проблему, которую вы испытываете. Например, как заполняется 'mySet'? –

+0

Является ли время компиляции или время выполнения? – shoosh

ответ

7

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

+2

Только немного верно: итератор 'std :: set' недействителен, только если элемент, к которому он относится, удаляется из набора: вы можете вставить любой элемент и удалить любой элемент, кроме одного. См. 23.1.2/8. – 2009-12-14 22:30:43

1

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

+0

Я не совсем уверен, как это может быть здесь, учитывая условия цикла. Возможно, я ошибаюсь: если я ошибаюсь, может кто-нибудь, пожалуйста, дайте мне небольшой пример или объяснение? Благодарю. –

+0

Platinum: Фактический код в вопросе - это не то, что он работает, это просто его впечатление («похоже»). – 2009-12-14 22:32:01

1

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

2

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

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

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

+0

Если вы решили не писать цикл, вы можете использовать 'unary_compose' вместе с функцией, которая сопоставляет пару с ее первым или вторым элементом. –