2011-06-09 136 views
21

我对此有点困惑,这两者对我来说都是一样的。 尽管在不同的编译器上容量和大小可能会有所不同。它如何可能有所不同。它还表示,如果我们内存不足,容量会发生变化。大小vs矢量的容量?

所有这些东西都有点不清楚。

有人可以给出一个解释(如果可能的话用和实例,或者如果我可以做任何程序的任何测试,以了解它)

+0

还检查了这个答案http://stackoverflow.com/questions/2787397 /什么最专门的向量容量#答案-2787405。那里有Java语言,但概念是一样的。 – rid 2011-06-09 17:39:01

回答

49

大小不允许在多个编译器之间不同。矢量的大小是它包含的元素的数量,它由您放入矢量的元素数量直接控制。

容量是矢量当前使用的空间量。在引擎盖下,一个向量只是使用一个数组。矢量的容量是该数组的大小。这总是等于或大于大小。它们之间的差异是可以在引擎盖下的数组需要重新分配之前添加到矢量中的元素的数量。

你应该几乎从不关心能力。它的存在是让具有非常具体的性能和内存限制的人按照自己的意愿去做。

+2

+1对我来说很明白,也是额外的imp。信息 - >“你几乎不应该关心能力,它的存在是让具有非常具体的表现和记忆限制的人按照自己的意愿去做。”谢谢 – munish 2011-06-09 17:54:09

+8

不关心不关心容量。如果你知道你有至少200个物品要存储在你的矢量中,那么在建造的时候你会很疯狂地告诉它。 – 2011-06-09 18:00:31

+2

疯了吗?我不一定这样认为。我只进行了一些测试,在保留空间的情况下插入了200个int,在保留空间之前我需要重复10万次以上的性能改进。当然,在保留空间的情况下,性能大约是它的两倍,但除非你在一个紧密的循环中这样做,而这是性能瓶颈,否则我不认为这太疯狂,不在乎几个微秒。 – 2011-06-09 18:36:52

21

尺寸:项目目前在向量的数量

容量:在“完整”之前可以在矢量中放入多少物品。一旦填满,添加新项目将导致分配一个新的,更大的内存块并将其中的现有项目复制到其中

+1

我会说不分配,但重新分配。因为向量保证数据在内存中连续布局,所以不能使用多个运算符'new'返回的内存块。所以当限制被命中时,向量将分配一个新的内存块并将现有数据复制到该内存中,然后删除以前分配的块。或者,如果它足够聪明,它将使用'realloc'函数来更加优化。 – 2011-06-09 17:41:43

+0

@Vlad:我假设你在看到我最后的编辑之前发表了评论? – 2011-06-09 17:58:34

5

size()告诉您当前有多少元素。 capacity()告诉你在向量需要为自己重新分配内存之前可以获得多大的大小。

容量始终大于或等于大小。你不能索引超出元素#size()-1

4

大小是向量中元素的数量。容量是矢量当前可以容纳的元素的最大数量。

16

比方说,你有一个桶。这个桶最多可容纳5加仑水,因此其容量为5加仑。它可能有0到5之间的任何水量,包括0和5。在桶中当前的水量是从矢量的角度来看它的大小。所以如果这个桶是半满的,它的大小为2.5加仑。

如果您尝试向水桶添加更多水并且水会溢出,则需要找到更大的水桶。所以你得到一个容量较大的水桶,并将旧水桶的内容倒入新水桶中,然后加入新水。

容量:Vector /存储桶可容纳的最大数量。 大小:当前在矢量/存储桶中的东西数量。

+0

你必须是一个instractor。我无法准确理解分配内存的含义,但我现在很明白它究竟意味着什么。 – snr 2015-08-11 18:24:40

2

尺寸是在载体中存在的元素的数目

容量是,矢量当前正在使用的空间量。

让我们从一个非常简单的例子理解:

using namespace std; 

int main(){ 
    vector<int > vec; 
    vec.push_back(1); 
    vec.push_back(1); 
    vec.push_back(1); 
    cout<<"size of vector"<<vec.size()<<endl; 
    cout<<"capacity of vector"<<vec.capacity()<<endl; 
    return 0; 
} 

目前大小为3, 容量4.

现在,如果我们推回多了一个元素,

using namespace std; 
    int main(){ 
    vector<int> vec; 
    vec.push_back(1); 
    vec.push_back(1); 
    vec.push_back(1); 
    vec.push_back(1); 
    cout<<"size of vector"<<vec.size()<<endl; 
    cout<<"capacity of vector"<<vec.capacity()<<endl; 
    return 0; 
} 

现在 尺寸为:4 容量为4

现在,如果我们试图在vector插入一个多元素,则大小将成为5,但能力将成为8

它发生的基础上vector的数据类型,这里在这种情况下vectorint类型的,因为我们知道int的大小是4字节,所以编译器会分配4块内存。当我们尝试添加第5个元素时,vector::capacity()是我们目前的两倍。

同样保持on..for例如:如果我们试图插入第九元素则vector规模将是9和容量的B16 ..