Меня все еще путают различия между картой и наборами данных в STL. Я знаю, что set хранит значения отсортированным образом, а как насчет карты? Сохраняет ли значения в отсортированном порядке? Карта хранит пары значений (ключ, значение), в чем преимущество этой функции?
В чем разница между установкой vs map в С++?
Ответ 1
Как минимум для упорядоченных версий (std::map
и std::set
), map
облегчает использование set
, позволяя вам ввести внешний ключ (map::key_type
), чтобы определить порядок элементы, которые иначе не могут быть получены из типа данных map
(map::data_type
). Если упорядочение может быть полностью выведено (путем сравнения двух элементов) из map::data_type
, тогда вам обычно лучше использовать set
, и в этом случае вы избежите дублирования ключа как map::key_type
.
В некотором смысле, std::map
является избыточным, и вы всегда можете использовать std::set
вместо этого, введя новый тип элемента, который объединяет ключи с данными и предоставляет необходимую функцию сравнения. Однако это громоздко и обычно неэлегантно.
Чтобы выяснить, почему a set
может быть громоздким по a map
; A set
будет хранить пару <key, data>
в качестве элемента, а map
будет поддерживать разделение между 2. Это означает, например, что для операции find
в set
, где параметр find
построенный на месте, весь элемент <key, data>
должен быть построен, хотя он действительно находится на key
, который необходим для операции find
. Конструкция элементов data
элемента set
тогда избыточна и может быть довольно неэффективной, если, например, члены data
представляют дисковое хранилище или связаны с какой-либо другой сложной или долговременной конструкцией. map
устраняет это, только создавая фактический key
, необходимый для find
.
Подводя итог, рассмотрим элемент <key, data>
, для которого вам интересно, использовать ли map
или set
для хранения нескольких упорядоченных элементов. Если key
охватывает весь data
(это означает, что data
пуст или еще key == data
), вам лучше использовать set
, в этом случае вы избежите a) дублирования хранилища key
и b), вероятно, потребуется синхронизировать 2 key
. Если key
не содержится в data
, тогда (вы должны) использовать map
. Трудная часть заключается в том, что key
является (правильным) подмножеством в data
. Затем вам необходимо скомпенсировать стоимость поддержания дубликата key
(для a map
) и стоимости построения data
, которая не перекрывается с key
(для a set
), последняя, которая может произойти для операций find
.
Ответ 2
Концептуально, set - это совокупность вещей, тогда как карта - это отображение ключей к значениям.
Ответ 3
A map
хранит выбранные ключи. Он отображает ключи в значения. Обычно он реализуется как двоичное дерево поиска для ключей. A set
- это отображение, в котором значения не имеют значения.
unordered_map
и unordered_set
(новые в С++ 11) сохраняют ключи несортированными и используют хеш-таблицу для поиска.
Ответ 4
std::map
- ассоциативный контейнер, хранящий пары ключей-значений с уникальными ключами. std::set
также является ассоциативным контейнером, который хранит набор сортировщиков объектов (или ключей).
Вы должны посмотреть std:: map и std::. установить
Ответ 5
std::map
и std::set
очень похожи. У них обоих есть сортированная коллекция уникальных ключей. Кроме того, map
имеет значение, связанное с каждым ключом.