C ++中set vs map有什么区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++中set vs map有什么区别?相关的知识,希望对你有一定的参考价值。
我仍然对STL中的map和set数据结构之间的差异感到困惑。我知道set是以排序的方式存储值,那么map呢?它是按排序顺序存储值吗?地图存储成对的值(键,值),这个功能的优点是什么?
至少对于有序版本(std::map
和std::set
),map
通过允许您引入外部密钥(set
)来确定map::key_type
数据类型无法导出的元素的排序,从而促进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
操作,find
的参数是在现场构建的,整个<key, data>
元素将必须建造,而它真的在key
操作所需的find
。然后,data
元素的set
成员的构造是多余的,并且如果例如data
成员代表磁盘存储或涉及一些其他复杂或耗时的构造操作,则可能相当低效。 map
通过只需构建key
所需的实际find
来缓解这种情况。
总而言之,考虑一个元素<key, data>
,你想知道是否使用map
或set
来存储多个有序元素。如果key
跨越整个data
(意思是data
是空的或者key == data
)那么你最好使用set
,在这种情况下你将避免a)复制key
存储和b)可能必须保持2 key
s同步。如果key
不包含data
那么(你必须)使用map
。棘手的部分是当key
是data
的(适当的)子集时。然后,您必须权衡维持重复key
s(对于map
)的成本与构建data
的成本,该成本不与key
(对于set
)重叠,后者可能发生在find
操作中。
从概念上讲,set是一组东西,而地图是键到值的映射。
map
存储密钥排序。它将键映射到值。通常它被实现为密钥的二叉搜索树(red-black tree)。 set
是一个价值无关的地图。 unordered_map
和unordered_set
(C ++ 11中的新增功能)存储键未排序并使用哈希表进行搜索。
std::map
是一个关联容器,用于存储具有唯一键的键值对。 std::set
也是一个关联容器,用于存储分拣机对象(或键)。
std::map
和std::set
非常相似。它们都有一个排序的唯一键集合。此外,map
具有与每个键相关联的值。
以上是关于C ++中set vs map有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章