Говорят, что итераторы map.find() и map.end() несовместимы?

Я использую функции map.find(key) и map.end() в операторе if:

if( p_Repos->returnTypeMap().find(tc[0]) != p_Repos->returnTypeMap().end() ) 

Но это не работает, и я получаю сообщение об ошибке библиотеки времени выполнения Microsoft Visual C++, которое говорит мне: «Выражение: итераторы списка несовместимы». tc[0] — это просто строка, а ключевая позиция на моей карте — это строка.

Но они должны быть совместимы, верно?

Любая помощь приветствуется.

Спасибо, Том

Изменить: на основе ответа, найденного здесь: Поиск значения в unordered_map, Я склоняюсь к тому, что это должно работать.

Второе редактирование:
Вот функция returnTypeMap():

std::unordered_map <std::string, std::pair<std::string, std::string>> returnTypeMap()
{
      return typeTable;
}

Вот определение моей карты:

std::unordered_map <std::string, std::pair<std::string, std::string>> typeTable;

person traggatmot    schedule 16.03.2013    source источник
comment
returnTypeMap() возвращает значение? Если это так, то каждый итератор указывает на совершенно другой map.   -  person Mankarse    schedule 16.03.2013
comment
Манкарсе, я не уверен, что вы имеете в виду. Должен ли я установить локальную карту = для карты, которую я храню в своем объекте p_Repos?   -  person traggatmot    schedule 16.03.2013
comment
Возможно, вам следует использовать if( p_Repos->returnTypeMap().count(tc[0]) > 0 ) вместо этого.   -  person leewz    schedule 26.12.2013


Ответы (1)


Вы возвращаете map по значению, поэтому каждый вызов оценивается как совершенно другой map. Итераторы в разных контейнерах несовместимы, и попытка их сравнения имеет неопределенное поведение.

Попробуйте изменить свой код, чтобы он возвращался по ссылке const:

std::unordered_map<std::string, std::pair<std::string, std::string>> const& 
returnTypeMap() const
{
    return typeTable;
}

или сделайте локальную копию карты и вызовите find и end на одной локальной копии:

auto typeTable{p_Repos->returnTypeMap()};
if (typeTable.find(tc[0]) != typeTable.end()) {
    //...
}
person Mankarse    schedule 16.03.2013
comment
Спасибо - я сделаю локальную копию, так как я не очень хорошо разбираюсь в использовании квалификатора const. Если вы не против уточнить, как я буду использовать квалификатор const, я мог бы попытаться реализовать это. - person traggatmot; 16.03.2013
comment
@traggatmot: важной частью является не квалификатор const, а тот факт, что вы будете возвращаться по ссылке (и поэтому не будете делать копии typeTable при его возврате). - person Mankarse; 16.03.2013