C ++中set vs map有什么区别?

时间:2014-02-28 07:12:14

标签: c++ stl

我仍然对STL中地图和设置数据结构之间的差异感到困惑。我知道set是以排序的方式存储值,那么map呢?它是按排序顺序存储值吗? 地图存储成对的值(键,值),这个功能有什么优势?

5 个答案:

答案 0 :(得分:24)

至少对于有序版本(std::mapstd::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之间的分隔。例如,findset的操作{1}}其中find的参数是在现场构建的,当<key, data>元素真正在key上时,必须构建整个find元素这是data操作所需要的。 set元素的data成员的构造是多余的,例如,如果map成员代表磁盘存储或涉及其他某些成员,则效率可能相当低复杂或耗时的施工作业。 key只需构建find所需的实际<key, data>即可缓解此问题。

总结一下,请考虑一个元素map,您想知道是否要使用setkey来存储多个有序元素。如果data跨越整个data(意味着key == data为空或set),那么您最好使用key,在这种情况下您可以使用key #39; ll避免a)重复key存储和b)可能必须保持2 data s同步。如果map中未包含key,那么(您必须)使用data。棘手的部分是当keymap的(适当的)子集时。然后,您必须权衡维护重复data s(key)的成本与构建set的成本与find不重叠的成本(对于{{1}}),后者可能会发生{{1}}次操作。

答案 1 :(得分:12)

从概念上讲,set是事物的集合,而地图是键到值的映射。

答案 2 :(得分:12)

map存储已排序的键。它将键映射到值。通常它被实现为密钥的二叉搜索树(red-black tree)。 set是值不相关的地图。 unordered_mapunordered_set(C ++ 11中的新增内容)存储键未排序并使用哈希表进行搜索。

答案 3 :(得分:0)

std::map是一个关联容器,用于存储具有唯一键的键值对。 std::set也是一个关联容器,用于存储分拣机对象(或键)。

您应该查看std::mapstd::set

答案 4 :(得分:0)

std::mapstd::set非常相似。它们都有一个排序的唯一键集合。此外,map具有与每个密钥相关联的值。