Это может быть глупый вопрос, я совершенно новичок в C++ и программировании в целом. Я хочу понять использование нескольких контейнеров STL и с учетом этого, мне было интересно, какие преимущества имеют использование std :: set vs, например, с использованием векторов или карт? Я не могу найти явного ответа на этот вопрос. Я заметил, что наборы используют карты, но почему бы не всегда использовать карты или всегда использовать наборы. Вместо этого предоставляются 2 довольно похожих контейнера. Спасибо заранее.Преимущества std :: set vs vectors или maps
ответ
И std::set
и std::map
являются ассоциативными контейнерами. Разница в том, что std::set
s содержит только ключ, тогда как в std::map
есть связанное значение. Выбор одного над другим зависит в основном от того, что под рукой. Если вы хотите создать словарь всех слов, которые появляются в тексте, вы можете использовать std::set<std::string>
, но если вы также хотите подсчитать, сколько раз каждое слово появлялось (т. Е. Связывало значение с ключом), тогда вам понадобится std::map<std::string,int>
. Если вам не нужно связывать этот счет, нет смысла иметь ненужный int
.
Спасибо вам большое, это все, что мне нужно знать – brunodd
Если вы хотите проверить, существует ли значение в 'set', так же быстро, как проверить, существует ли ключ в' map'? – thomthom
@thomthom: Требования одинаковы, и большинство реализаций используют одну и ту же базовую структуру данных (RB-tree), поэтому ответ заключается в том, что как с теоретической точки, так и на практике стоимость одна и та же. –
Это относится к гарантиям сложности, которые наиболее желательны для вашего применения, в отношении вставки, удаления, извлечения и т. Д. Я настоятельно рекомендую Эффективный STL Скотта Мейерса.
vector
быстрее для вставок и удалений в задней части контейнера. Вы можете получить доступ к элементам через оператор [].dequeue
похож наvector
, но имеет переднюю вставку и удаление.set
имеет только ключ, аmap
имеетpair
. Оба этих контейнера быстрее вставляются и удаляются в середине контейнера. Вы также можете получить доступ к элементам через find с помощью алгоритмов STL.
набор полезен для хранения уникальных вещей, как перечисление для «typeOfFruits»
std::set<typeOfFruits> fruits;
fruits.insert (banana);
fruits.insert (apple);
fruits.insert (pineapple);
//it's fast to know if my store sells a type of fruit.
if (fruits.find (pear) == fruits.end())
{ std::cout<<"i don't have pear"; }
карта полезна для хранения уникальных вещей, плюс «значение»
std::map<typeOfFruits, double /*unit price*/> fruits;
fruits[banana] = 1.05;
fruits[apple] = 0.85;
fruits[pineapple] = 3.05;
//repeating pineapple will replace the old price (value)
fruits[pineapple] = 3.35;
//it's fast to know how much a fruit costs.
std::map<typeOfFruits, double /*unit price*/> itr = fruits.find(pineapple);
if (itr != fruits.end())
{ std::cout<<"pineapples costs: $" <<itr->second; }
вектор полезен для хранения вещей, где упорядочена последовательность (push_back()). Представьте, что вы просматриваете свои фрукты в кассе, и программа отслеживает это сканирование.
std::vector<typeOfFruits> fruits;
fruits.push_back(apple);
fruits.push_back(apple);
fruits.push_back(apple);
fruits.push_back(banana);
fruits.push_back(banana);
fruits.push_back(pineapple);
//i scanned 3 apples, 2 bananas and 1 pineapple.
Ни один орган не упомянул факты, которые std::set
фактически неизменны. Вы не должны изменять значение какого-либо элемента в нем. std::set
не отслеживает изменения, поэтому, когда вы редактируете элемент в нем, вы идете за его спину и, вероятно, измените свой внутренний порядок. Это рискованное поведение. Поэтому используйте std::map
, если вы хотите редактировать элементы после помещения их в контейнер. Удостоверьтесь, что вы используете key
, чтобы побудить заказ и все, что вам нужно изменить после этого, в value
.
- 1. std: sort vs inserting into std :: set
- 2. Являются ли std :: vectors threadsafe?
- 3. Относительная производительность std :: vector vs. std :: list vs. std :: slist?
- 4. std :: set :: find vs std :: find on std :: set with const
- 5. Wrap std :: vector of std :: vectors, C++ SWIG Python
- 6. Преимущества использования std :: function
- 7. Разница между std :: set и std :: priority_queue
- 8. Fail safe vs Fail fast iterators (Vectors)
- 9. MySQL enum vs. set
- 10. std :: unique_ptr vs std :: shared_ptr vs std :: weak_ptr vs std :: auto_ptr vs raw указатели
- 11. std :: back_inserter для std :: set?
- 12. индекс или позиция в std :: set
- 13. Выполняется копирование с std :: map или std :: set thread-safe?
- 14. Написание шаблона, который может использовать std :: vector или std :: set
- 15. Какая сортировка у нас в std :: map или std :: set?
- 16. Использование std :: set или std :: map с общей памятью
- 17. Каковы преимущества использования C# vs F # или F # vs C#?
- 18. ограничить размер std :: set
- 19. set vs unordered_set vs sorted vector
- 20. :: std :: initializer_list vs variadic templates
- 21. Vector of Vectors C++
- 22. std :: async vs std :: prom
- 23. Преимущества WebServiceGatewaySupport vs WebServiceTemplate
- 24. Можно ли разместить std :: list :: iterator в std :: set?
- 25. C++ unordered_set of vectors
- 26. Сортировка строк - std :: set or std :: vector?
- 27. Дальше std :: set woes
- 28. Перейти эквивалентно std :: set?
- 29. std :: set elements исчезает
- 30. std :: move Vs std :: forward
«std :: set» похож на «std :: map» без значения и полностью не связан с 'std :: vector' ... –
Вам нужна [хорошая документация] (http: // en.cppreference.com/w/). –
Все они делают разные вещи. Выберите тот, который вам нужен, чтобы решить вашу проблему.Это похоже на вопрос, почему мы должны хранить соль, масло и сахар на кухне, а не всегда использовать апельсиновый сок. –