У меня странная проблема, я не знаю, то ли я пропустил чтение документации, то ли мой компьютер делает что-то странное.
У меня есть unordered_map. Я хочу перебирать ведра unordered_map в порядке ведер. Эта часть важна, так как мне нужно, чтобы доступ был относительно случайным. Я искал cplusplus.com и нашел это. Код выглядит следующим образом:
// unordered_map::bucket
#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
std::unordered_map<std::string,std::string> mymap = {
{"us","United States"},
{"uk","United Kingdom"},
{"fr","France"},
{"de","Germany"}
};
for (auto& x: mymap) {
std::cout << "Element [" << x.first << ":" << x.second << "]";
std::cout << " is in bucket #" << mymap.bucket (x.first) << std::endl;
}
return 0;
}
Результат, которого я ожидал и хотел на своем компьютере, был
Element [us:United States] is in bucket #1
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #2
Element [uk:United Kingdom] is in bucket #4
Однако вывод, который я получаю, вместо этого сортируется по типу значения, что странно
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #1
Element [us:United States] is in bucket #1
Я даже пытался заменить значение классом, в котором не было операторов сравнения, и он все еще мог их сортировать. Это связано с тем, как мой компьютер хранит карту, или cplusplus.com устарел? Я смог перебрать ведра через такой цикл:
for ( unsigned int i = 0; i < b.bucket_count(); ++i) {
for ( hash_table::const_local_iterator image_iterator =
b.begin(i);image_iterator!= b.end(i); ++image_iterator ){
Единственная проблема заключается в том, что мне нужно иметь возможность пропустить определенное количество значений, т.е. мне нужен только 1 элемент на каждые 100, что требует сложных циклов и работает медленно.
Любая помощь будет оценена по достоинству. Я не могу понять это!
[EDIT] С моим кодом моя unordered_map на самом деле является unordered_map, где точка — это простой класс, который имеет только две переменные-члены и не имеет вспомогательных функций.
Когда я запускаю цикл выше на своей карте, вот мой вывод. Я связал текстовый файл, так как он довольно длинный здесь Еще больше меня смущает то, что в моем классе Point нет операторов сравнения. Может ли это быть причиной моего заказа на вставку?
#2
с арифметикой по модулю. - person François Andrieux   schedule 22.11.2018std::unordered_map
не указан. Я понимаю, почему вы можете ожидать, что он будет заказывать их по ведрам, но я не знаю ничего, что гарантировало бы это. Очевидно, это не то, что здесь происходит. - person François Andrieux   schedule 22.11.2018unordered_map
не указан, поэтому не должен указываться в какой-либо документации. - person François Andrieux   schedule 22.11.2018"a"
,"b"
,"c"
,d
и вывод больше не сортируется (либо по ключу, либо по сегменту). Неупорядоченная карта неупорядочена. - person Igor Tandetnik   schedule 22.11.2018g++ main.cpp -o main.out
- person Michael Honaker   schedule 22.11.2018int
к чему-то будет иметь сегменты, отсортированные по ключу, еслиstd::hash<int>
— это просто функция идентификации. - person Max Langhof   schedule 22.11.2018std::hash
, которая будет использоваться в качестве ключа. Он никогда не используетoperator<
на клавишах. - person François Andrieux   schedule 22.11.2018unordered_map
. Порядок не указан, но это не означает случайный. Таким образом, даже странно хорошо упорядоченная последовательность может быть законным порядком. - person François Andrieux   schedule 22.11.2018std::hash
, и вы, вероятно, поймете, почему ваши хэши ключей отсортированы. - person François Andrieux   schedule 22.11.2018