Ответ 1
Контейнеры unordered_*
нуждаются в хеш-функции. По умолчанию они используют std::hash
, но специализация std::hash
для std::pair<T1,T2>
отсутствует в стандартной библиотеке. С другой стороны, упорядоченные контейнеры полагаются на std::less
(по умолчанию), а std::pair
- operator<
. Вот почему это просто работает.
Чтобы иметь неупорядоченный контейнер с pair
, вам нужно будет предоставить хэш-функтор самостоятельно. Например:
struct SimpleHash {
size_t operator()(const std::pair<int, int>& p) const {
return p.first ^ p.second;
}
};
std::unordered_set<std::pair<int, int>, SimpleHash> S;
S.insert(std::make_pair(0, 1));