2009-11-11 49 views
3

昨天晚上我为我的工作使用了std :: vector,这个问题突然出现在我脑海里:vector如何给随机访问?stl向量如何随机访问

我试图查看代码,但不成功。任何人都可以提供一些建议吗?

感谢, 阿伦

+9

“指针......哈哈哈” - > http://xkcd.com/138/ – 2009-11-11 20:32:53

回答

12

当然,这里有一些指针:

int *x, *y; 

但严重的是,一个vector内部只是实现为一个数组。它提供了一个超载索引操作符([]),允许您像访问数组一样访问它。

+0

+1,非常聪明 – 2009-11-11 18:58:09

+9

+1(+2给出多个指针,但是-1给未初始化的指针:) – 2009-11-11 19:18:53

18

向量使用下面的连续内存,因此它以与数组本身相同的方式给予随机访问:它知道元素的起始地址和大小,并执行一些指针数学运算。

1

向量通常使用动态数组实现[*] ...在任何时候数据都存储在一个连续的内存块中,因此指针运算可用于O(1)访问任何(已存在的)元件。

高效动态数组的技巧(假设你还不知道它),总是将保留存储的大小至少增加一个常数(请参阅Jerry Coffin注释)。这样做的结果是,当我们添加不定数量的新元素时,为了简单起见,将因子设为2,将第一个元素复制到第n个添加,并且将第(2 * n)个添加和第(4 * n)个添加和...

该系列收敛,所以我们可以保证添加N个新元素需要O(N)时间。但是,任何给定的添加可能需要重新分配以及所有现有元素的副本,因此没有任何延迟保证。

[*]我不知道会达到所需性能的另一种机制。任何人?

+0

虽然你想通过一个常数来增加尺寸,但你通常要使用一个小于2的因子。正如Andrew Koenig在一段时间以前所表明的那样,您通常需要一个小于1 + sqrt(5)/ 2'的因子 - 这会随着时间推移更好地重用内存。 – 2009-11-11 20:08:13

+1

注意'1 + sqrt(5)/ 2'大于2 ... – 2009-11-11 20:38:44

+0

尽管'(1 + sqrt(5))/ 2'不是。所以我准备相信这个说法并不完全垃圾,只是包含一个错字... – 2009-11-12 03:52:02

1

至少两个

的因素其实,许多实现使用的1.5 的因素,重要的是,它是一个因素,所以你得到的指数向量的增长。