为什么C++的std::set是关联式容器?

14
为什么将std::set定义为关联容器?
我的意思是,std::map是一个关联容器,因为它将值映射到键上,但是为什么std::set也是关联容器呢?

2
@LuchianGrigore 23.4 和其他地方。 - ecatmur
1
它将自己与自己相关联... - Alex Chamberlain
标准中的区别在于“序列容器”与“关联容器”。虽然将set视为“关联容器”有些牵强,但这是对名称对比的合理选择。 - Pete Becker
这个回答解决了你的问题吗?为什么std::set是一个关联容器 - Alex
2个回答

6

23.4.6.1 类模板set概述[set.overview]

set满足所有要求的[...]关联式容器(23.2.4)[...]

因为它满足关联式容器的所有前提条件,这些条件在23.2.4中描述,并不像“将键映射到值”一样简单。

第二段甚至强调了这一点(或者更确切地说,强调了事实上mapmultimap具有超出关联式容器的其他功能):

23.2.4 关联式容器[associative.reqmts]

2) 每个关联式容器都是基于Key和一个次序关系Compare进行参数化的,该次序关系使Key元素具有严格的弱序(25.4)。此外,map和multimap将一个任意类型T与Key关联起来。类型Compare的对象称为容器的比较对象。

完整的段落太长,在此无法复制。


明白了,因此不是键值关联性定义容器。 - Johnny Pauling
@Luchian 我们能说std::set是一个容器,类似于一个顺序容器,具有额外的功能,如排序数据和使用红黑树实现,以提供O(logn)访问吗? - cbinder
@cbinder 我认为不需要实现RB树。 - Luchian Grigore
点击这里查看:https://dev59.com/VmPVa4cB1Zd3GeqP4ERF。同时,请注意我的早前评论是否合理。 - cbinder

2

点击此处访问cplusplus.com上的参考文档。

在一个集合中,键是唯一的值。

编辑:

“在关联容器中,元素是通过它们的键而非它们在容器中的绝对位置来引用的。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接