2009-09-07 190 views
4

我很难概念化C++集,实际上一般设置。什么是C++中的“set”?他们什么时候有用?

它们是什么?它们如何有用?

+1

http://www.google.com/search?q=c%2B%2B+sets – Aziz 2009-09-07 22:50:47

+3

是的感谢。我甚至阅读了关于集合的维基百科文章,但是我发现的所有定义都是关于“抽象数据结构”和“有限集合”的定义。我想我只是希望得到一个“傻瓜式”简单的英文解释......所以我想我不能因为暗示我愚蠢而不是真正的帮助而责怪你。 – 2009-09-07 22:59:51

+1

@Monte,如果我以任何方式冒犯了你,我表示歉意。我只是建议搜索谷歌,因为有很多文章解释有关的概念。 – Aziz 2009-09-07 23:32:29

回答

24

如果您在理解套件时一般不会感觉不好。大多数数学学位都花在即将与集合论方面:

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}

A C++集是这样的一个实施数学对象,这是奇怪的功能是排序内部。但这只是实现的细节,与理解数据结构无关。排序只是为了提高速度。

5

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

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

3

“设置”是一种存储多个但唯一对象的集合。当你想要收集物体时,它很有用,但是你不关心它们的顺序或者它里面有多少个同样的物体。

更多细节请参见本:Set in C++

+0

“当你想要收集物体时,它很有用,但是你不关心它们的顺序或者它里面有多少个相同的物体。”当你不能/不想要使用一组时,这不正确吗?当您关心订单并且您不需要重复时,一个集合非常有用。 – DeusAduro 2009-09-07 23:10:58

+1

正如DeusAduro所说,一个C++ Set存储排序的元素,并且只允许一个唯一的实例处于相同状态。 – 2009-09-07 23:15:46

+0

你是正确的订购!我与Java中的Set相混淆。抱歉。 – NawaMan 2009-09-08 00:02:44

0

Citing Wikipedia:

一组是不同 对象的集合,在 其本身视为一个对象。集是 数学中最基本的概念之一 。虽然它在19世纪末被发明为 ,但现在理论是 数学中普遍存在的一部分,并且可以用作基础,从中可以导出几乎所有的数学。

3

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

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

某些STL实现还支持hash_set,它与set非常相似,因为它也是一个集合的数学概念的模拟。集和hash_set之间最大的区别是hash_sets做排序它们的元素,它们具有不同的性能特点(O(1)而不是O(log n)的查找窗口,假设一个好的哈希函数),当然他们不是标准的。

0

STL seta red-black tree(至少这是我怎么想它的实现)

看它的另一种方式。

因此,性能,快速的元素的搜索,排序元素,元素的独特性,有序横向等等。

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

2

它们是什么?

一组是一个集合。

一组就像是一个字典或键/值对的'映射',除了它只存储(是一组键)而没有相关联的值。

一组任一或不包含每个可能的密钥值的一个实例。例如,一组整数可能包含值{0,1,5}。一个值(例如5)不能在集合中被多次包含(如果你对一个给定的键值多次调用集合的插入方法,集合仍然只包含该键值的一个实例)。

它们的用法?

我几乎不会像地图一样频繁地使用它们。

有一次我用一组是,如果我这就给远三分球这一个客户端使用作为手柄库。我将保留一个包含我创建的所有有效句柄值的私有集合。当客户端给我一个句柄时,我会通过测试该值是否包含在我的集合中来测试句柄是否为有效句柄。

+0

让我感到困惑的设置代码正是像跟踪手柄一样使用它们。 – 2009-09-08 02:04:29

0

对于C++的无序执行的套,检查出Boost.Unordered。在许多情况下,这是比STL集合更好的选择,我个人或多或少地用它来逐步构建排序列表。

相关问题