什么是C ++中的“集合”?它们什么时候有用?

时间:2009-09-07 22:48:35

标签: c++ set computer-science

我很难概念化c ++集,实际上是一般的。

他们是什么?它们有用吗?

8 个答案:

答案 0 :(得分:27)

如果您在理解集合时遇到问题,请不要感到难过。大多数数学学位都是用集理论来表达的:

http://en.wikipedia.org/wiki/Set_theory

将集合视为唯一的无序对象的集合。在许多方面,它看起来像一个列表:

{1,2,3,4}

但顺序并不重要:

{4,3,2,1} = {1,2,3,4}

重复被忽略:

{1,1,2,3,4} = {1,2,3,4}

C ++集是这个数学对象的一个​​实现,奇怪的特性在内部排序。但这只是实现的细节,与理解数据结构无关。排序只是为了速度。

答案 1 :(得分:5)

C ++ STL集是关联映射,它保证集合中元素的排序和唯一性(Multisets保证前者而不是后者)。

它们通常用作集合操作的一部分 - 例如联合,交叉点和其他涉及在集合中包含/排除元素的交互。

答案 2 :(得分:3)

“Set”是一种存储多个但唯一的对象的集合。当您想要收集对象但不关心它们的顺序或者同一个对象在其中的次数时,它很有用。

有关详细信息,请参阅此处:Set in C++

答案 3 :(得分:3)

Sets“一般来说”是数学中的(非常基本的)概念。

STL的set基于集合的数学概念:它是唯一成员的集合,或STL术语中的“唯一关联容器”。一个有点奇怪的事情是它对元素进行排序(在数学集中,元素没有“顺序”)。

某些STL实现也支持hash_set,它与set非常相似,因为它也是集合的数学概念的类比。 set和hash_set之间的巨大差异是hash_sets 对其元素进行排序,它们具有不同的性能特征(O(1)而不是O(log n)查找,假设良好的哈希函数),当然它们不是标准的。

答案 4 :(得分:2)

  

他们是什么?

集合是一个集合。

一个集合类似于字典或键/值对的“映射”,除了它只存储(是一组)没有关联值的键。

集合包含或不包含每个可能键值的实例。例如,一组整数可能包含值{0,1,5}。一个值(例如5)不能在集合中包含多于一次(如果对给定的键值多次调用set的insert方法,该集合仍将只包含该键值的一个实例)。

  

它们有用吗?

我几乎不像地图那样经常使用它们。

有一次我使用一个集合,如果我是一个库,它提供客户端用作句柄的指针。我将保留一个包含我创建的所有有效句柄值的私有集。当客户端给我一个句柄时,我将通过测试该值是否包含在我的集合中来测试句柄是否是有效的句柄。

答案 5 :(得分:0)

Citing Wikipedia:

  

集合是不同的集合   对象,被视为对象   它自己的权利。集是其中之一   最基本的概念   数学。虽然它是发明的   在19世纪末,集   理论现在是无处不在的一部分   数学,可以用作   几乎全部的基础   数学可以得出。

答案 6 :(得分:0)

STL seta red-black tree(至少我认为它是如何实现的)

另一种看待它的方式。

因此属性,快速元素搜索,元素排序,元素唯一性,有序遍历等。

当您想要跟踪唯一元素(例如唯一字符串或整数列表)时,它非常有用,但您也可以存储更复杂的结构。

答案 7 :(得分:0)

对于C ++中无序的集合实现,请查看Boost.Unordered。在许多情况下,这是一个比STL集合更好的选择,我个人或多或少只会用它来逐步构建一个排序列表。