Подтвердить что ты не робот

В чем разница между std:: set и std::vector?

Сейчас я изучаю STL. Я читал о контейнере set. У меня вопрос, когда вы хотите использовать set? После прочтения описания набора оно выглядит бесполезным, потому что мы можем заменить его на vector. Не могли бы вы сказать "плюсы" и "cos" для контейнеров vector vs set. Благодаря

4b9b3361

Ответ 1

A set упорядочен. Гарантируется, что он останется в определенном порядке, согласно предоставленному вами функтору. Независимо от того, какие элементы вы добавляете или удаляете (если вы не добавите дубликат, который не разрешен в set), он всегда будет упорядочен.

A vector имеет точно и только порядок, который вы явно его даете. Элементы в vector находятся там, где вы их помещаете. Если вы выставляете их в нерабочее состояние, то они не в порядке; теперь вам нужно sort контейнер, чтобы вернуть их в порядок.

По общему признанию, set имеет относительно ограниченное использование. При правильной дисциплине можно вставлять элементы в vector и сохранять их упорядоченными. Однако, если вы постоянно вставляете и удаляете элементы из контейнера, vector будет работать во многих проблемах. Он будет много копировать/перемещать элементы и т.д., Так как это фактически просто массив.

Время, необходимое для вставки элемента в vector, пропорционально количеству элементов, уже находящихся в vector. Время, затрачиваемое на вставку элемента в элемент set, пропорционально log₂ количества элементов. Если количество предметов велико, это огромная разница. log₂ (100 000) - ~ 16; что значительное улучшение скорости. То же самое касается удаления.

Однако, если вы делаете все свои вставки сразу, во время инициализации, тогда проблем нет. Вы можете вставить все в vector, отсортировать его (заплатив эту цену один раз), а затем использовать стандартные алгоритмы для отсортированного vectors для поиска элементов и повторения по отсортированному списку. И хотя итерация по элементам a set не слишком медленная, итерация по vector выполняется быстрее.

Итак, есть случаи, когда отсортированный vector превосходит a set. При этом вы действительно не должны беспокоиться о расходах на такую ​​оптимизацию, если не знаете, что это необходимо. Поэтому используйте set, если у вас нет опыта работы с той системой, которую вы пишете (и, следовательно, знаете, что вам нужна эта производительность) или у вас есть данные профилирования, которые говорят вам, что вам нужен vector, а не set.

Ответ 2

Это разные вещи: вы решаете, как упорядочиваются векторы, и вы также можете поместить столько же предметов в вектор, сколько пожелаете. Наборы упорядочиваются в соответствии с установленными внутренними правилами (вы можете установить правила, но набор будет иметь дело с порядком), и вы не можете поместить несколько равных элементов в набор.

Конечно, вы могли бы сохранить вектор уникальных элементов, но ваша производительность сильно пострадает, когда вы будете выполнять операции с ориентацией. Например, предположим, что у вас есть набор из 10000 элементов и вектор из 10000 различных неупорядоченных элементов. Предположим теперь, что вам нужно проверить, является ли значение X одним из значений в наборе (или среди значений в векторе). Когда X не входит в число элементов, поиск вектора будет примерно в 100 раз медленнее. Вы увидите похожие различия производительности при вычислении объединений и пересечений множеств.

Подводя итог, наборы и векторы имеют разные цели. Вы можете использовать вектор вместо набора, но для этого потребуется больше работы, и это может сильно повредить производительность.

Ответ 3

быстрее искать элемент против множества, чем вектор (O (log (n)) vs O (n)). Чтобы выполнить поиск элемента по вектору, вам необходимо выполнить итерацию всех элементов в векторе, но для использования поиска используйте красно-черное дерево для оптимизации поиска. Посмотрите только на несколько элементов, чтобы найти совпадение.

Набор упорядочен, это означает, что вы можете перебирать его только от наименьшего к самому большому по порядку или по обратному порядку.

Но вектор неупорядочен, вы можете перемещать его по порядку вставки.

Ответ 4

form cpluplus.com набор:

Наборы - это контейнеры, в которых хранятся уникальные элементы, порядок.

так что множество упорядочено И элемент однозначно представлен

а vect:

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

поэтому вектор находится в том порядке, в котором вы его заполняете. И может содержать несколько идентичных элементов.

предпочитает набор:

  • если вы хотите фильтровать несколько идентичных значений
  • если вы хотите проанализировать элементы в указанном порядке (для этого в векторе требуется специально отсортировать вектор).

предпочитают вектор:

  • если вы хотите сохранить одинаковые значения
  • если вы хотите разобрать элементы в том же порядке, что и вы их нажали (при условии, что вы не обрабатываете векторный порядок)