Почему я не могу заменить std :: map на std :: unordered_map

Этот вопрос может быть немного схематичным, потому что у меня нет кода дома, но я знаю, что в противном случае эта штука будет беспокоить меня все выходные .

Когда я попытался обновить код до C ++ 11, я начал заменять некоторые std :: map на std :: unordered_map . Код использовал только std :: map :: find () для доступа к определенному элементу на карте, поэтому я решил, что замена должна быть простой. Возвращенный итератор был сохранен в переменной с типом auto ( auto res = map.find (x) , поэтому типизация должна выполняться нормально. Однако при доступе к сохраненному элементу с помощью res-> second.do_stuff () Я получил ошибку компилятора, сообщающую мне, что struct std :: pair не имеет члена second . Теперь это действительно сбивает с толку меня, но, к сожалению, у меня не было времени на дальнейшие исследования.

Может быть, этой информации достаточно, чтобы кто-нибудь мог мне подсказать эту странную ошибку компилятора.Или я так понимаю, что std :: map и std :: unordered_map должны иметь один и тот же интерфейс, за исключением частей, которые требуют упорядочивания, неверно?

EDIT :

Как и обещал, здесь еще немного анализа проблемы. Скорее всего, это позволит кому-то лучше мне сейчас помочь. Как я догадывался из подсказок в комментариях, это было вызвано не точкой, где я получил доступ к элементам на карте, а какой-то другой частью кода. Причина, по которой я обнаружил, заключалась в том, что я использовал карту в классе X для хранения указателей на другие элементы класса X (своего рода древовидная структура). Однако, похоже, это работает для std :: map , но не для std :: unordered_map . Вот очень простой код, демонстрирующий проблему:

#include <stdint.h>
#include <unordered_map>
#include <map>

class Test {
  std::map<uint32_t, Test> m_map1; // Works
  std::unordered_map<uint32_t, Test> m_map; // gives error: ‘std::pair<_T1, _T2>::second’ has incomplete type
};

int main() {
  return 1;
}

std :: map работает std :: unordered_map не работает. Любые идеи, почему это так, или что можно сделать, чтобы заставить его работать с std :: unordered_map ?

10
задан LiKao 12 December 2011 в 10:25
поделиться