我仍然对STL中地图和设置数据结构之间的差异感到困惑。我知道set是以排序的方式存储值,那么map呢?它是按排序顺序存储值吗? 地图存储成对的值(键,值),这个功能有什么优势?
答案 0 :(得分:24)
至少对于有序版本(std::map
和std::set
),map
通过允许您引入外部密钥(set
来促进map::key_type
的用例。 {1}})确定元素的排序,否则这些元素不能从map
的数据类型(map::data_type
)派生。如果可以从map::data_type
完全导出排序(通过比较2个元素),那么通常最好使用set
,在这种情况下,您将避免将密钥重复为map::key_type
。
在某种程度上,std::map
是多余的,您可以使用std::set
来代替,方法是引入一种新的元素类型,该类型会在提供必要的比较功能的同时将键与数据聚合在一起。然而,这很麻烦,而且通常不够优雅。
澄清为什么set
可能比map
更麻烦; set
将<key, data>
对存储为元素,map
将保持2之间的分隔。例如,find
对set
的操作{1}}其中find
的参数是在现场构建的,当<key, data>
元素真正在key
上时,必须构建整个find
元素这是data
操作所需要的。 set
元素的data
成员的构造是多余的,例如,如果map
成员代表磁盘存储或涉及其他某些成员,则效率可能相当低复杂或耗时的施工作业。 key
只需构建find
所需的实际<key, data>
即可缓解此问题。
总结一下,请考虑一个元素map
,您想知道是否要使用set
或key
来存储多个有序元素。如果data
跨越整个data
(意味着key == data
为空或set
),那么您最好使用key
,在这种情况下您可以使用key
#39; ll避免a)重复key
存储和b)可能必须保持2 data
s同步。如果map
中未包含key
,那么(您必须)使用data
。棘手的部分是当key
是map
的(适当的)子集时。然后,您必须权衡维护重复data
s(key
)的成本与构建set
的成本与find
不重叠的成本(对于{{1}}),后者可能会发生{{1}}次操作。
答案 1 :(得分:12)
从概念上讲,set是事物的集合,而地图是键到值的映射。
答案 2 :(得分:12)
map
存储已排序的键。它将键映射到值。通常它被实现为密钥的二叉搜索树(red-black tree)。 set
是值不相关的地图。
unordered_map
和unordered_set
(C ++ 11中的新增内容)存储键未排序并使用哈希表进行搜索。
答案 3 :(得分:0)
答案 4 :(得分:0)
std::map
和std::set
非常相似。它们都有一个排序的唯一键集合。此外,map
具有与每个密钥相关联的值。