Я получил эту документацию из отличной ссылки SGI STL:
Карта имеет важное свойство, что вставка нового элемента в карту не делает недействительными итераторы, указывающие на существующие элементы. Стирание элемента с карты также не отменяет никаких итераторов, за исключением, конечно, для итераторов, которые фактически указывают на стираемый элемент.Итак, итератор, который у вас есть, который указывает на стираемый элемент, конечно же, будет признан недействительным. Сделайте что-то вроде этого:
if (some condition)
{
iterator here=iter++;
aMap.erase(here)
}
Да, вы не можете использовать оператор []
. Используйте find
, но обратите внимание, что вместо iterator
возвращается const_iterator
:
std :: map & lt; std: : string, std :: string & gt; :: const_iterator it; it = map.find (имя); if (it! = map.end ()) {std :: string const & amp; data = it- & gt; second; // ...}
Это как с указателями. Вы не можете назначить int const *
на int *
. Аналогично, вы не можете назначить const_iterator
на итератор
.
Когда вы используете operator [], std :: map ищет элемент с заданным ключом. Если он не найден, он создает его. Следовательно, проблема с const.
Используйте метод find, и все будет в порядке.
Можете ли вы отправить код о том, как вы пытаетесь использовать find ()? Правильный путь:
if (map.find (name)! = Map.end ()) {// ...}
Для ваших «несоответствующих ошибкам итератора const»:
find () имеет две перегрузки:
Итератор find (const key_type & amp; x); const_iterator find (const key_type & amp; x) const;
Моя догадка заключается в том, что вы получаете эту ошибку, потому что вы делаете что-то вроде назначения неконстантного итератора (слева) к результату a find ()
вызывает на const
карту:
итератор & lt; ... & gt; myIter / * non-const * / = myConstMap.find (...)
Это приведет к ошибке, хотя, возможно, и не той, которую вы видите.
Возможно, потому, что в std :: map нет оператора const []. оператор [] добавит элемент, который вы ищете, если он его не найдет. Поэтому используйте метод find (), если вы хотите искать без возможности добавления.
Если вы используете C ++ 11, std :: map :: at должен работать для вас.
Причина std :: map :: operator [] не работает, так как в случае, если ключ, который вы ищете, не существует на карте, он будет вставлять новый элемент с помощью предоставленного ключа и возвращать ссылку на него (см. ссылку для получения подробной информации). Это невозможно для const std :: map.
Однако метод «at» генерирует исключение, если ключ не существует. При этом лучше всего проверить наличие ключа с помощью метода std :: map :: find, прежде чем пытаться получить доступ к элементу с помощью метода «at».