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

问题描述 投票:29回答:5

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

c++ stl
5个回答
25
投票

至少对于有序版本(std::mapstd::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>,你想知道是否使用mapset来存储多个有序元素。如果key跨越整个data(意思是data是空的或者key == data)那么你最好使用set,在这种情况下你将避免a)复制key存储和b)可能必须保持2 keys同步。如果key不包含data那么(你必须)使用map。棘手的部分是当keydata的(适当的)子集时。然后,您必须权衡维持重复keys(对于map)的成本与构建data的成本,该成本不与key(对于set)重叠,后者可能发生在find操作中。


13
投票

从概念上讲,set是一组东西,而地图是键到值的映射。


12
投票

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


0
投票

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

你应该看看std::mapstd::set


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.