std::set相对于向量或映射的优点
advantages of std::set vs vectors or maps
这可能是一个愚蠢的问题,我对c++和编程都很陌生。我想了解几个STL容器的使用,考虑到这一点,我想知道使用std::set与例如使用向量或映射的优势是什么?对于这个问题,我似乎找不到明确的答案。我注意到集合使用映射,但为什么不总是使用映射或者总是使用集合呢?相反,提供了2个非常相似的容器。
std::set
和std::map
都是关联容器。不同之处在于std::set
s只包含键,而std::map
中有一个关联值。选择哪一个主要取决于手头的任务是什么。如果你想建立一个文本中出现的所有单词的字典,你可以使用std::set<std::string>
,但如果你还想计算每个单词出现的次数(即将值与键关联),那么你就需要std::map<std::string,int>
。如果您不需要关联该计数,那么使用不必要的int
是没有意义的。
集合用于存储唯一的东西,例如"typeOfFruits"的enum
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"; }
map用于存储唯一的东西,加上一个'value'
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; }
vector用于存储排序的对象(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.
没有人提到std::set
实际上是不可变的。您不应该更改其中任何元素的值。std::set
不跟踪更改,所以当您编辑其中的元素时,您可能会在背后更改其内部顺序。这是一种危险的行为。因此,如果您想在将元素放入容器后对其进行编辑,请使用std::map
。确保使用key
来诱导排序,然后将需要的所有内容更改为value
。
-
vector
对于容器后面的插入和删除更快。您可以通过操作符[]访问这些元素。 -
dequeue
与vector
相似,但具有正面插入和删除功能。 -
set
只有key,而map
有一个pair
。这两种容器在容器中间插入和删除都更快。你也可以使用STL算法通过find访问元素。
归根结底是应用程序最需要的复杂性保证,包括插入、删除、检索等。我强烈推荐Scott Meyers的Effective STL。
- 如何在 c++ 中创建结构向量的映射
- 在C++中初始化向量映射的最有效方法
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 字符串共享内存映射的向量
- 具有 2 个分量的数组的特征映射到 3 的向量
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 如何初始化 std::向量的映射?
- 访问映射中的分区向量
- 如何将整数向量插入到键中,标准::映射的值
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- 如何从向量映射中迭代向量
- 访问映射向量的映射元素(c++)
- 映射向量的时间复杂性是多少
- C++:通过从映射向量分配映射实例来填充映射的映射
- 在一个映射向量上迭代,如果满足条件,则插入一个副本
- 如何在映射向量中循环访问地图
- 丢弃限定符 访问类中的映射向量时出错
- 从常量迭代器到映射向量,获取映射向量中映射元素的键和值
- 映射向量c++