Итератор карты констант не будет установлен в mymap.begin () - PullRequest
9 голосов
/ 03 мая 2011
map<string,Shopable*>::iterator it = mymap.begin();

Итератор выглядит постоянным, но items.begin() не возвращает постоянного итератора.Или это то, что я думаю , потому что ошибка при наведении курсора примерно такая:

"No conversion from 'std::Tree_const_iterator<...> to std::Tree_iterator<...> exists'".

Почему?

Ответы [ 2 ]

19 голосов
/ 03 мая 2011

Используйте const_iterator как:

map<string,Shopable*>::const_iterator it = mymap.begin();

Из ошибки ясно, что mymap.begin() возвращает const_iterator. Это потому, что mymap - это const в функции, где вы написали это, что-то вроде следующего:

void f(const std::map<int,int> & m)
{    //^^^^^ note this

      std::map<int,int>::const_iterator it = m.begin(); //m is const in f()
                       //^^^^^ note this
}

void g(std::map<int,int> & m)
{
      std::map<int,int>::iterator it = m.begin(); //m is non-const in g()
}

То есть контейнер const (будь то std::map, std::vector и т. Д.) Возвращает const_iterator, а неконстантный контейнер возвращает iterator.

Каждый контейнер имеет перегруженные функции begin() и end(). Таким образом, контейнер const вызывает перегруженный begin(), который возвращает const_iterator, а неконстантный контейнер вызывает другой перегруженный begin(), который возвращает iterator. И то же самое для end() перегруженных функций.

4 голосов
/ 03 мая 2011

Проблема в том, что mymap в приведенном выше коде является картой констант, а не изменяемой картой (может быть, она является членом класса, и этот код находится внутри функции константы-члена?). Таким образом, вызов mymap.begin() вызовет перегрузку, которая возвращает const_iterator вместо перегрузки, которая возвращает iterator.

Если вам не нужно менять контейнер через итератор, используйте const_iterator. Если вы намереваетесь изменить карту, убедитесь, что вы используете неконстантный объект для цикла (может быть, функция-член (если это так) не должна быть константной?)

...