Это может быть глупый вопрос, я совершенно новый для С++ и программирования в целом. Я хочу понять использование нескольких контейнеров STL и с учетом этого, мне было интересно, какие преимущества имеют использование std:: set vs, например, с использованием векторов или карт? Я не могу найти явного ответа на этот вопрос. Я заметил, что наборы используют карты, но почему бы не всегда использовать карты или всегда использовать наборы. Вместо этого предоставляются 2 довольно похожих контейнера. Спасибо заранее.
Преимущества std:: set vs векторов или карт
Ответ 1
Оба std::set
и std::map
являются ассоциативными контейнерами. Разница в том, что std::set
содержит только ключ, а в std::map
- связанное значение. Выбор одного над другим зависит в основном от того, что под рукой. Если вы хотите построить словарь всех слов, которые появляются в тексте, вы можете использовать std::set<std::string>
, но если вы также хотите подсчитать, сколько раз каждое слово появлялось (т.е. Связывать значение с ключом), тогда вы требуется std::map<std::string,int>
. Если вам не нужно связывать этот счет, нет смысла иметь int
, что не нужно.
Ответ 2
набор полезен для хранения уникальных вещей, таких как перечисление для "typeOfFruits"
std::set<typeOfFruits> fruits;
fruits.insert (banana);
fruits.insert (apple);
fruits.insert (pineapple);
//it 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 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.
Ответ 3
-
vector
быстрее для вставок и удалений в конце контейнера. Вы можете получить доступ к элементам через оператор []. -
dequeue
похож наvector
, но он имеет переднюю вставку и удаление. -
set
имеет только ключ, аmap
имеетpair
. Оба этих контейнера быстрее вставляются и удаляются в середине контейнера. Вы также можете получить доступ к элементам через find с помощью алгоритмов STL.
Ответ 4
Ни один орган не упомянул факты, что std::set
на самом деле неизменен. Вы не должны изменять значение какого-либо элемента в нем. std::set
не отслеживает изменения, поэтому, когда вы редактируете элемент в нем, вы заходите за его спину и, вероятно, измените его внутренний порядок. Это рискованное поведение. Поэтому используйте std::map
, если вы хотите редактировать элементы после их размещения в контейнере. Убедитесь, что вы используете key
, чтобы вызвать упорядочение и все, что вам нужно изменить после этого, на value
.
Ответ 5
Это сводится к гарантиям сложности, которые наиболее желательны для вашего приложения, в отношении вставки, удаления, извлечения и т.д. Я настоятельно рекомендую Эффективный STL Скотта Мейерса.