Похоже, что сравнения равенства нарушены для hash_set
и unordered_set
в Visual C ++ 2010.
Я реализовал наивную функцию равенства для неупорядоченных контейнеров, используя язык из стандартного , цитируемого Мэтью , чтобы убедиться, что это ошибка (просто чтобы убедиться):
template <typename UnorderedContainer>
bool are_equal(const UnorderedContainer& c1, const UnorderedContainer& c2)
{
typedef typename UnorderedContainer::value_type Element;
typedef typename UnorderedContainer::const_iterator Iterator;
typedef std::pair<Iterator, Iterator> IteratorPair;
if (c1.size() != c2.size())
return false;
for (Iterator it(c1.begin()); it != c1.end(); ++it)
{
IteratorPair er1(c1.equal_range(*it));
IteratorPair er2(c2.equal_range(*it));
if (std::distance(er1.first, er1.second) !=
std::distance(er2.first, er2.second))
return false;
// A totally naive implementation of is_permutation:
std::vector<Element> v1(er1.first, er1.second);
std::vector<Element> v2(er2.first, er2.second);
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
if (!std::equal(v1.begin(), v1.end(), v2.begin()))
return false;
}
return true;
}
Возвращает, что hs1
и hs2
из вашего примера равны. (Кто-нибудь, дайте мне знать, если вы обнаружите ошибку в этом коде; я не особо ее тестировал ...)
Я отправлю отчет о дефектах в Microsoft Connect.