的std ::优点设置VS载体或地图(advantages of std::set vs vecto

2019-09-01 09:50发布

这可能是一个愚蠢的问题,我很新的C ++和编程一般。 我想了解在脑海中使用的一些STL容器和与,我想知道什么优点是使用std ::设置VS例如使用载体或地图? 我似乎无法找到一个明确的回答这个问题。 我注意到,集使用地图,但为什么不经常使用地图或总是使用套。 取而代之的是提供了2升非常相似的容器。 提前致谢。

Answer 1:

双方std::setstd::map是关联容器。 不同的是, std::set小号只包含的关键,而在std::map有关联的值。 选择一个比其他主要取决于什么手头的任务。 如果你想建立的是出现在文本的所有词的字典,你可以使用std::set<std::string>但如果你也想统计每个字有多少次出现(即值相关联在关键的),那么你就需要一个std::map<std::string,int> 。 如果你不需要那算不算关联,它没有意义有int这是不必要的。



Answer 2:

一组是用于存储独特的东西就像一个枚举的“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.


Answer 3:

  • vector是在所述容器的背面为插入和缺失更快。 您还可以通过操作[]访问的元素。
  • dequeue类似于vector但它具有前插入和删除。
  • set仅具有键的同时map具有一pair 。 这两个容器是插入和删除在容器中间更快。 您也可以通过查找访问元素与STL算法。


Answer 4:

没有身体已经提到的事实std::set实际上是不可改变的。 你不应该改变它的任何元素的值。 std::set ,当你编辑它元素你去它的背后,并有可能改变其内在的顺序不跟踪了变化左右。 这是一种危险的行为。 因此使用std::map如果你想你把它们放进容器后编辑元素。 请确保您使用key诱导订购,你需要事后变成一切value



Answer 5:

它归结到最需要的为您的应用程序,相对于插入,删除,检索等我强烈建议斯科特迈尔斯有效的STL的复杂性保证。



文章来源: advantages of std::set vs vectors or maps