std :: set vs vector或maps的优点

bru*_*odd 39 c++ stdmap stdvector stdset

这可能是一个愚蠢的问题,我对C++和编程很新.我想了解几个STL容器的使用,考虑到这一点,我想知道使用std :: set vs使用矢量或地图的优点是什么?我似乎无法找到这个问题的明确答案.我注意到集合使用地图,但为什么不总是使用地图或总是使用集合.而是提供了两个非常相似的容器.提前致谢.

Dav*_*eas 62

这两个std::setstd::map是相关联的容器.区别在于std::sets只包含密钥,而在std::map那里有一个相关的值.选择一个主要取决于手头的任务是什么.如果你想建立一个文本中出现的所有单词的字典,你可以使用a std::set<std::string>,但是如果你还要计算每个单词出现的次数(即将一个值与键相关联),那么你需要一个std::map<std::string,int>.如果您不需要关联该计数,那么没有必要这样做是没有意义的int.


Ang*_*Koh 24

一个集合用于存储像"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"; }
Run Code Online (Sandbox Code Playgroud)

地图对于存储唯一的东西很有用,加上"值"

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; }
Run Code Online (Sandbox Code Playgroud)

向量可用于存储序列排序的内容(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.
Run Code Online (Sandbox Code Playgroud)

  • `if (fruits.find (pear) ==fruits.end())` 也可以更简单地表示为 `if ( !fruits.count(pear) )`,因为 `set` (_et al._) 只能包含任何给定值的 0 或 1,任何半体面的库实现者都会意识到这一点,并根据 `find() != end` 为我们实现 `count()`(即在找到后不会继续迭代),让我们不必编写冗长的代码。(无论如何,对于`libstdc++` 8 来说都是如此) (2认同)

Ruo*_*Liu 6

没有任何机构提到过std::set实际上不可改变的事实。您不应更改其中任何元素的值。std::set不会跟踪更改,因此当您编辑其中的元素时,您会落后于它,并且可能会更改其内部顺序。这是一种危险的行为。因此,std::map如果您想在将元素放入容器后对其进行编辑,请使用。确保您使用key来诱导排序以及之后需要更改的所有内容value


luc*_*s92 5

  • vector在容器后面插入和删除的速度更快。您可以通过运算符 [] 访问元素。
  • dequeue与 类似,vector但它的特点是前置插入和删除。
  • set只有钥匙,而mappair。这两个容器在容器中间插入和删除的速度更快。您还可以使用 STL 算法通过查找来访问元素。