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