В стандарте C ++ 0x будет unordered_map, как это соотносится с увеличением unordered_map? - PullRequest
5 голосов
/ 11 декабря 2010

Что является более эффективным? Есть ли хорошие тесты?

Ответы [ 4 ]

5 голосов
/ 11 декабря 2010

Спецификация std :: unordered_map в C ++ 11 похожа на boost :: unordered_map, которая основана на tr1 :: unordered_map.При этом есть некоторые небольшие различия.Добавление ссылок на rvalue в C ++ 11 приводит к добавлению функций emplace и emplace_hint, которые могут быть полезны для производительности.

C ++ 11 теперь широко реализован, и поэтому вы должны иметь возможность использовать std:: unordered_map из коробки.C ++ 14 существенно не меняет его, а C ++ 17 (вероятно) добавит функции-члены insert_or_assign и try_emplace.

2 голосов
/ 13 декабря 2010

Одна второстепенная точка, еще не упомянутая, функция std::hash требуется только для того, чтобы иметь возможность вычислять хэши встроенных типов и строк (и некоторых других типов). Функция boost::hash может вычислять хэши более сложных объектов, таких как pair и tuple. Также boost имеет функцию hash_combine, помогающую создавать хэши для пользовательских типов.

Это означает, что std::unordered_set< pair<int, int> > не будет компилироваться, но boost::unordered_set< pair<int, int> > будет.

При необходимости вы можете использовать boost::hash с std::unordered_*.

(Ссылка: пункт 6.18 в Перечень вопросов технического отчета расширения библиотеки .)

2 голосов
/ 11 декабря 2010

В последнем стандартном черновике c ++ 0x n3225 есть раздел 23.6.1 шаблона класса unordered_map.

Так оно и есть.

C ++ 0x unordered_map предлагается на основе надстройки. Сама библиотека Boost также имеет пространство имен tr1 :: unordered_map, которое разделяет реализацию своего собственного boost :: unordered_map.

Если вы хотите сравнить (конечно, вам не нужно сравнивать boost с boost), я думаю, что некоторые другие компиляторы, включая microsoft visual studio 2010 и gcc, имеют собственную реализацию unordered_map. Вы можете использовать их, предполагая, что они находятся в пространстве имен tr1.

#include <unordered_map>
...
std::tr1::unordered_map<...>

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

1 голос
/ 12 декабря 2010

Это зависит от реализации и набора данных, о которых идет речь. Когда я играл с unordered_map для сообщения в блоге , я обнаружил, что std::unordered_map VS10 показал себя намного хуже, чем boost::unordered_map для ввода, который я использовал (я не собирал тщательный тест). В теории мысль не должна быть разницы.

...