Я бы повторил примерно ту же мысль, которую сделал GMan: в зависимости от типа использования, std::map
может быть (и часто) быстрее, чем std::tr1::unordered_map
(используя реализацию, включенную в VS 2008 SP1).
Есть несколько усложняющих факторов, о которых следует помнить.Например, в std::map
вы сравниваете ключи, что означает, что вы только когда-либо просматриваете достаточно начала ключа, чтобы различать правую и левую ветви дерева.По моему опыту, почти единственный раз, когда вы смотрите на весь ключ, это если вы используете что-то вроде int, которое вы можете сравнить в одной инструкции.С более типичным типом ключа, таким как std :: string, вы часто сравниваете всего несколько символов или около того.
Приличная хеш-функция, напротив, всегда смотрит на весь ключ.Таким образом, даже если поиск в таблице имеет постоянную сложность, сам хеш имеет примерно линейную сложность (хотя по длине ключа, а не по количеству элементов).Если в качестве ключей используются длинные строки, std::map
может завершить поиск до того, как unordered_map
даже начнет свой поиск.
Во-вторых, хотя существует несколько методов изменения размера хеш-таблиц, большинствоиз них довольно медленные - до такой степени, что если поиск не будет значительно более частым, чем вставки и удаления, std :: map часто будет быстрее, чем std::unordered_map
.
Конечно,как я уже упоминал в комментарии к вашему предыдущему вопросу, вы также можете использовать таблицу деревьев.Это имеет как преимущества, так и недостатки.С одной стороны, он ограничивает наихудший случай деревом.Это также позволяет быстро вставлять и удалять, потому что (по крайней мере, когда я это сделал) я использовал таблицу фиксированного размера.Исключение всех размеров таблиц позволяет вам сохранять хеш-таблицу намного проще и, как правило, быстрее.
Еще один момент: требования к хешированию и древовидным картам различны.Хеширование, очевидно, требует хеш-функции и сравнения на равенство, где упорядоченные карты требуют сравнения меньше, чем.Конечно, гибрид, о котором я говорил, требует и того, и другого.Конечно, для обычного случая использования строки в качестве ключа это на самом деле не проблема, но некоторые типы ключей подходят для упорядочивания лучше, чем хеширование (или наоборот).