Я использую метод std :: multimap.lower_bound для получения результата в диапазоне. Но в том же контенте контейнера иногда я получал неверную пару итераторов, и это приводило к краху моей программы. Я могу видеть содержимое в контейнере с Visual Studio, они все правильно. И я использую метод поиска multimap, он также хорошо работал. Просто возвращается проклятая неверная пара итераторов и сбой моей программы, и самое главное, я не могу выполнить тест, чтобы пропустить эту ситуацию. Что не так с этой ситуацией?
Мой пример кода выглядит следующим образом:
std::multimap<std::string,std::string>::iterator it = tagged_files.lower_bound("vocal");
std::multimap<std::string,std::string>::iterator it_end = tagged_files.upper_bound("vocal");
По большей части они работали хорошо. Когда я печатаю it
а также it_end
с% p (с использованием printf) их результаты равны 8f98ab9 (одно значение указателя) и 0 (тот же ключ). Когда я получаю недопустимые итераторы, в сообщениях отладки будут отображаться 8f98ab9 (то же значение) и 2b8a839 (странное значение).
Кроме того, размер tagged_files
всегда одно и то же. В течение всего сеанса элемент не был вставлен вообще, даже получены недействительные итераторы. Это также доказано printf% d с tagged_files.size()
,
Когда у меня есть недопустимый итератор с контейнером std, таким как map, multimaps, 90% времени, причина в том, что я перебираю контейнер, а я удаляю элементы в этом контейнере.
Как только элемент удален (или даже вставлен в некоторые другие контейнеры) в контейнере, действительное состояние итераторов больше не гарантируется.
edit: как сказано в комментариях ниже, правила аннулирования итераторов варьируются от контейнера к контейнеру. сравни этот вопрос
edit2: вы не показываете нам, как вы разыменовываете свои итераторы.
Ваш итератор — std :: pair, и ты должен проверить возвращаемый итератор не равен yourContainer.end () до того, как вы его разыщите. Но так как вы не показываете нам код, в котором вы разыменовываете итератор, трудно сказать. Вы не показываете нам ни то, как вы выводите свои следы.
Других решений пока нет …