Проблемы с C ++ const с оператором == [duplicate]

Я получил эту документацию из отличной ссылки SGI STL:

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

Итак, итератор, который у вас есть, который указывает на стираемый элемент, конечно же, будет признан недействительным. Сделайте что-то вроде этого:

if (some condition) { iterator here=iter++; aMap.erase(here) }
14
задан Jon Seigel 8 April 2010 в 03:54
поделиться

5 ответов

Да, вы не можете использовать оператор [] . Используйте 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 на итератор .

26
ответ дан Johannes Schaub - litb 16 August 2018 в 00:39
поделиться

Когда вы используете operator [], std :: map ищет элемент с заданным ключом. Если он не найден, он создает его. Следовательно, проблема с const.

Используйте метод find, и все будет в порядке.

Можете ли вы отправить код о том, как вы пытаетесь использовать find ()? Правильный путь:

  if (map.find (name)! = Map.end ()) {// ...}  
7
ответ дан Benoît 16 August 2018 в 00:39
поделиться

Для ваших «несоответствующих ошибкам итератора 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 (...)  

Это приведет к ошибке, хотя, возможно, и не той, которую вы видите.

2
ответ дан Dan Breslau 16 August 2018 в 00:39
поделиться

Возможно, потому, что в std :: map нет оператора const []. оператор [] добавит элемент, который вы ищете, если он его не найдет. Поэтому используйте метод find (), если вы хотите искать без возможности добавления.

2
ответ дан Fred Larson 16 August 2018 в 00:39
поделиться

Если вы используете C ++ 11, std :: map :: at должен работать для вас.

Причина std :: map :: operator [] не работает, так как в случае, если ключ, который вы ищете, не существует на карте, он будет вставлять новый элемент с помощью предоставленного ключа и возвращать ссылку на него (см. ссылку для получения подробной информации). Это невозможно для const std :: map.

Однако метод «at» генерирует исключение, если ключ не существует. При этом лучше всего проверить наличие ключа с помощью метода std :: map :: find, прежде чем пытаться получить доступ к элементу с помощью метода «at».

3
ответ дан Rohit Shrinath 16 August 2018 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: