Неупорядоченная карта, повторяющаяся по значениям - PullRequest
0 голосов
/ 22 ноября 2018

У меня странная проблема, которую я не знаю, скучаю ли я по чтению документации или мой компьютер делает что-то странное.

У меня есть 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 - это простой класс, который имеет только две переменные-члена и никаких вспомогательных функций.

Когда я запускаю цикл выше на моей карте, вот мой вывод.Я связал текстовый файл, так как это довольно длинный файл здесь Что меня смущает еще больше, так это то, что в моем классе Point нет операторов сравнения.Может ли это быть причиной моего порядка вставки?

1 Ответ

0 голосов
/ 22 ноября 2018

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

Как сказал @ Francois Andrieux в разделе комментариев, порядок итерации std::unordered_map не указан, поэтому вы не можете ожидать одинакового поведения итерации во всехмашины, например, вывод на моем компьютере:

Element [de:Germany] is in bucket #0
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #4
Element [us:United States] is in bucket #4
...