大小与向量的容量?

mun*_*ish 33 c++ vector

我有点困惑这两个看起来对我来说都是一样的.虽然可能会出现不同编译器的容量和大小可能不同的情况.它可能有什么不同.它还说,如果我们内存不足,容量会发生变化.

所有这些事情对我来说都不太清楚.

有人可以给出解释.(如果可能的话和示例,或者如果我可以对任何程序进行任何测试来理解它)

Joh*_*eek 64

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

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

你几乎不应该关心容量.它的存在是为了让具有非常特定性能和内存限制的人完全按照自己的意愿行事.

  • 不同意不关心容量.如果你知道你的向量中至少有200个项目存储,那么在构建时你不会告诉它. (11认同)
  • @John:所以即使知道重新分配可能你仍然没有将一个已知的数字传递给构造函数以防止重新分配?我支持我的"疯狂".即使在现代机器上使用整数(最佳情况场景测试),我也会这样做,以使代码的意图更清晰,更不用说嵌入式系统上的更大结构. (4认同)
  • +1清楚地了解我和额外的imp.info - >"你几乎从不关心容量.它的存在是为了让具有非常特定性能和内存限制的人完全按照自己的意愿行事." 谢谢 (3认同)
  • 疯?我不一定这么认为.我只是运行了一些测试,在有和没有预留空间的情况下插入200`int`s,我需要超过100,000次重复,然后保留空间显示出显着的性能提升.当然,当保留空间时,性能大约是两倍,但除非你是在一个紧密的循环中这样做,这是你的性能瓶颈,我真的不认为在几微秒内不在乎它是多么的疯狂. (3认同)
  • @Kent:我不同意这个原则.我认为,如果您处于对容器最终用途有明确了解的非常具体的情况下,保留容量是一种很好的做法.这就是为什么我的答案中的"从不"读为"*几乎*从不". (3认同)
  • @Don:的确如此。但是项目副本总数为* O(N)*。 (3认同)

Ken*_*art 25

大小:向量中当前项目的数量

容量:向量在"满"之前可以容纳多少项.一旦完成,添加新项将导致分配新的,更大的内存块并将现有项复制到其中


Coe*_*ect 24

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

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

容量:Vector/bucket可容纳的最大内容量.大小:当前在Vector/bucket中的内容量.


san*_*eev 7

大小是向量中存在的元素数

容量是向量当前使用的空间量.

让我们用一个非常简单的例子来理解它:

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;
}
Run Code Online (Sandbox Code Playgroud)

目前规模为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;
}
Run Code Online (Sandbox Code Playgroud)

现在尺寸是:4容量是4

现在,如果我们尝试再插入一个元素,vector则大小将变为5,但容量将变为8.

它发生在数据类型的基础上vector,如本例vector中的类型int,因为我们知道大小int为4个字节,因此编译器将分配4块内存..当我们尝试添加第5个元素时,vector::capacity()是我们当前加倍的.

同样保持...例如:如果我们尝试插入第9个元素,那么大小vector将为9,容量将为b 16 ..


Oli*_*rth 6

size()告诉你当前有多少元素. capacity()告诉你在向量需要为自己重新分配内存之前,大小可以达到多大.

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


Pet*_*ete 5

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