A set
заказан. гарантированно остается в определенном порядке, в соответствии с указанным вами функтором. Независимо от того, какие элементы вы добавляете или удаляете (если только вы не добавили дубликат, который не разрешен в set
), он всегда будет упорядочен.
A vector
имеет точно и только порядок, который вы явно указали. Предметы в vector
находятся там, где вы их положили. Если вы поставите их не по порядку, значит, они вышли из строя; теперь вам нужно sort
контейнер, чтобы вернуть их в порядок.
По общему признанию, set
имеет относительно ограниченное использование. При надлежащей дисциплине можно было вставлять предметы в vector
и держать их в порядке. Однако, если вы постоянно вставляете и удаляете предметы из контейнера, vector
столкнется с множеством проблем. Он будет выполнять множество операций копирования / перемещения элементов и т. Д., Поскольку он фактически представляет собой массив.
Время, необходимое для вставки элемента в vector
, пропорционально количеству элементов, уже находящихся в vector
. Время, необходимое для вставки элемента в set
, пропорционально log₂ от количества элементов. Если количество предметов велико, это огромная разница. log₂ (100000) - ~ 16; это значительное улучшение скорости. То же самое касается удаления.
Однако, если вы делаете все свои вставки одновременно, во время инициализации, тогда нет проблем. Вы можете вставить все в vector
, отсортировать его (заплатив эту цену один раз), а затем использовать стандартные алгоритмы для сортировки vectors
, чтобы найти элементы и перебрать отсортированный список. И хотя итерация по элементам set
не совсем медленная, итерация по vector
быстрее.
Так что есть случаи, когда отсортированный vector
бьет set
. При этом, вы действительно не должны беспокоиться о расходах такого рода оптимизации, если вы не знаете, что это необходимо. Поэтому используйте set
, если у вас нет опыта работы с типом системы, которую вы пишете (и, следовательно, вы не знаете, что вам нужна эта производительность), или если у вас есть данные профилирования, которые говорят вам, что вам нужен vector
, а не set
.