std :: set vs向量或映射的优点
这可能是一个愚蠢的问题,我对C ++和编程一般来说是相当新的。 我希望了解几个STL容器的使用,考虑到这一点,我想知道使用std :: set和使用向量或映射的好处是什么? 我似乎无法find这个问题的明确答案。 我注意到集合使用地图,但为什么不总是使用地图或总是使用集合。 而是提供了2个非常类似的容器。 提前致谢。
std::set
和std::map
都是关联的容器。 不同的是, std::set
只包含键,而在std::map
有一个关联的值。 select一个在另一个主要取决于手头的任务是什么。 如果你想创build出现在文本中的所有单词的字典,你可以使用一个std::set<std::string>
,但是如果你还想计算每个单词出现的次数(即将一个值到关键),那么你将需要一个std::map<std::string,int>
。 如果你不需要关联这个计数,那么让int
是不必要的是没有意义的。
一个集合用于存储独特的东西,如“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; }
一个向量对于存储顺序sorting的东西是有用的(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.
-
vector
在容器后面插入和删除的速度更快。 您可以通过操作员[]访问元素。 -
dequeue
与vector
类似,但具有前插入和删除function。 - 只有
map
有一pair
时才set
密钥。 这两个容器在容器中间插入和删除的速度都较快。 您也可以通过使用STLalgorithm查找来访问元素。
没有人提到std::set
实际上是不可变的事实。 你不应该改变任何元素的值。 std::set
不会跟踪变化,所以当你编辑一个元素时,你会后退,并且可能会改变它的内部顺序。 这是一个冒险的行为。 因此,如果要在将元素放入容器后编辑元素,请使用std::map
。 确保你使用key
来诱导订购,并把所有你需要改变的value
。
这涉及到您的应用程序最需要的复杂性保证,关于插入,删除,检索等。我强烈推荐Scott Meyers的Effective STL 。