Давайте рассмотрим set
против unordered_set
.
Основное отличие здесь заключается в «природе» итерации, то есть обход набора даст вам элементы по порядку, а обход диапазона в неупорядоченном наборе даст вам набор значений в произвольном порядке.
Предположим, вы хотите пройти через диапазон [it1, it2]
. Если мы исключим время поиска, необходимое для поиска элементов it1 и it2, не может быть прямого сопоставления одного случая с другим, поскольку не гарантируется, что промежуточные элементы будут одинаковыми, даже если вы использовали одни и те же элементы для создания контейнера. .
Однако бывают случаи, когда что-то подобное имеет значение, когда, например. вы хотите пройти фиксированное количество элементов (независимо от того, что они собой представляют) или когда вам нужно пройти весь контейнер. В таких случаях необходимо учитывать механику реализации:
Наборы обычно реализуются как красно-черные деревья (разновидность бинарных деревьев поиска). Как и все бинарные деревья поиска, они допускают эффективный обход по порядку (LRR: левый корень справа) своих элементов. То есть для прохождения вы платите за погоню за указателем (точно так же, как при обходе списка).
С другой стороны, неупорядоченные наборы — это хеш-таблицы, и, насколько мне известно , реализация STL использует хеширование с цепочкой. Это означает (на очень высоком уровне), что для структуры используется (непрерывный) буфер, где каждый элемент является главой цепочки (списка), содержащей элементы. То, как элементы расположены в этих цепочках (сегментах) и в буфере, повлияет на время обхода, однако на этот раз вы снова будете гоняться за указателями, прыгая через разные списки. Я не думаю, что он будет сильно отличаться от случая с деревом, но точно не будет лучше.
В любом случае микронастройка и бенчмаркинг дадут вам ответ для вашего конкретного приложения.
person
Nikos Athanasiou
schedule
21.07.2015
std::vector
. Что лучше выбрать между упорядоченным и неупорядоченным и почему? :) - person 101010   schedule 21.07.2015boost
. - person 101010   schedule 21.07.2015