У меня есть boost :: unordered_map, но, похоже, он в порядке, давая мне подавляющее ощущение: «Ты делаешь это неправильно». Почему это результат в порядке? Я бы ожидал, что алгоритм хеширования лежащий в основе были рандомизированы этот порядок:boost :: unordered_map ... заказан?
#include <iostream>
#include <boost/unordered_map.hpp>
int main()
{
boost::unordered_map<int, int> im;
for(int i = 0; i < 50; ++i)
{
im.insert(std::make_pair(i, i));
}
boost::unordered_map<int, int>::const_iterator i;
for(i = im.begin(); i != im.end(); ++i)
{
std::cout << i->first << ", " << i->second << std::endl;
}
return 0;
}
... дает мне ...
0, 0
1, 1
2, 2
...
47, 47
48, 48
49, 49
При рассмотрении исходного кода BOOST в:
inline std::size_t hash_value(int v)
{
return static_cast<std::size_t>(v);
}
... который объяснил бы это. В приведенных ниже ответах также содержится мнение более высокого уровня, которое я нашел полезным.
Вместо того, чтобы вставлять 'i', попробуйте вставлять (и печатать на консоль в то же время при вставке) случайные числа, видеть, будут ли результаты упорядочены, или если они просто упорядочены по порядку, в который они были вставлены. , – FrustratedWithFormsDesigner
Если вам нужен случайный порядок, используйте std :: random_shuffle :) – Drakosha
@Drakosha: Я не ищу случайный порядок, но неупорядоченный порядок в порядке оставил меня неудобным. (Не минимальный тестовый файл имеет несколько тысяч целых чисел, но они все еще в порядке) – Thanatos