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

Преимущества std:: set vs векторов или карт

Это может быть глупый вопрос, я совершенно новый для С++ и программирования в целом. Я хочу понять использование нескольких контейнеров STL и с учетом этого, мне было интересно, какие преимущества имеют использование std:: set vs, например, с использованием векторов или карт? Я не могу найти явного ответа на этот вопрос. Я заметил, что наборы используют карты, но почему бы не всегда использовать карты или всегда использовать наборы. Вместо этого предоставляются 2 довольно похожих контейнера. Спасибо заранее.

4b9b3361

Ответ 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 Скотта Мейерса.