Почему карты C ++ не реализованы как попытки? - PullRequest
7 голосов
/ 20 января 2012

Попытки очень быстрые структуры данных. Поиск слова занимает время O (sizeofword), в то время как std::map s - самобалансируемые деревья. Почему стандартные шаблоны карт C ++ не реализованы с помощью попыток. Есть ли какая-то конкретная причина? Есть ли какие-то компромиссы в использовании дерева вместо самобалансирующегося дерева?

1 Ответ

24 голосов
/ 20 января 2012

Попытки могут использоваться только в том случае, если хранимые ключи могут быть обработаны цифра за цифрой или символ за символом.C ++ std::map и std::set предназначены для работы с любыми сопоставимыми элементами в качестве ключей и, следовательно, не могут быть реализованы способом, который обрабатывает ключи посимвольно.Вместо этого они (как правило) используют сбалансированные бинарные деревья поиска, которым не нужно анализировать ключи, и вместо этого могут просто использовать компаратор для быстрого поиска.

Если вы точно знаете, что определенные свойства сохраняются для вашегоключи, в некоторых случаях вы можете сделать даже лучше, чем пытается (см. например, дерево Ван Эмде Боаса ).Тем не менее, разработчикам библиотек приходится разрабатывать для большого количества вариантов использования, и, следовательно, может потребоваться выбрать параметры, которые работают медленнее, чем абсолютно лучший вариант, потому что им нужно обрабатывать максимально возможное количество вариантов.Вполне возможно, что соответствующая реализация C ++ содержит специализацию std::map или std::set, которая использует три, когда ключи являются строками.Я не верю, что все это делают, но теоретически это возможно.

Надеюсь, это поможет!

...