c++ 向量的 size() 和 capacity()
Posted
技术标签:
【中文标题】c++ 向量的 size() 和 capacity()【英文标题】:size() and capacity() of c++ vectors 【发布时间】:2020-11-07 13:22:24 【问题描述】:我刚刚开始使用 C++ 的标准库,我开始使用的第一件事是 std::vector
。我对向量中的capacity()
有点困惑。我知道在每个push_back()
之后,向量的capacity
以指数幂变化,但在下面的输出中,capacity
有时保持相同的值,即使在插入之后也是如此。有人可以向我解释一下内部工作吗?
#include<iostream>
#include<vector>
using namespace std;
int main()
vector<int> v;
int capacity=v.capacity();
cout<<"Capacity before push_back(): "<<capacity<<endl;
for(int i=0;i<10;i++)
v.push_back(i);
cout<<"Capacity: "<<v.capacity()<<endl;
for(auto j=v.begin();j!=v.end();j++)
cout<<*j<<endl;
cout<<"Size of vector: "<<v.size()<<endl;
cout<<"Final Capacity of vector: "<<v.capacity()<<endl;
return 0;
输出:
Capacity before push_back(): 0
Capacity: 1
Capacity: 2
Capacity: 4
Capacity: 4
Capacity: 8
Capacity: 8
Capacity: 8
Capacity: 8
Capacity: 16
Capacity: 16
0
1
2
3
4
5
6
7
8
9
Size of vector: 10
Final Capacity of vector: 16
【问题讨论】:
向量仅在新大小大于当前容量时才分配新容量。 作为 C++ 的初学者,您可以简单地忘记容量。就像这个概念不存在一样。 size() 很重要,但在处理高级或内存密集型程序之前,容量并不是一个有用的概念 “容量”是一张桌子上有多少把椅子。 “大小”是有多少人在使用这些椅子。 push_back 让一个人坐在桌子旁(增加尺寸),但如果没有足够的椅子,就必须有人去买一堆椅子,然后然后这个人就可以坐了。 这能回答你的问题吗? size vs capacity of a vector? 【参考方案1】:我知道在每个
push_back()
之后,向量的capacity
以指数幂变化,但在下面的输出中,capacity
有时保持相同的值,即使在插入之后也是如此。
这就是你的误解所在。向量的 CAPACITY 不会在每次 插入时增加,它的 SIZE 反而会增加。当插入导致 SIZE 超过当前 CAPACITY,或者如果您明确请求 CAPACITY,CAPACITY 会增长> 通过调用reserve()
方法来增加。
【讨论】:
【参考方案2】:来自Vector:[强调]
向量的存储是自动处理的,可以根据需要进行扩展和收缩。向量通常比静态数组占用更多空间,因为分配了更多内存来处理未来的增长。这样一个向量不需要在每次插入元素时重新分配,而只需要在额外的内存耗尽时重新分配。 可以使用 capacity() 函数查询分配的内存总量。额外的内存可以通过调用 shrink_to_fit() 返还给系统。 (C++11 起)
【讨论】:
【参考方案3】:我知道,在每次 push_back() 之后,向量的容量会以指数幂变化,但在上面的 OUTPUT 中,有时即使插入后容量仍然保持不变。
当容量大于插入后的大小时,容量不需要,保证不改变。
此策略允许顺序推回具有恒定的复杂性(摊销)。
【讨论】:
以上是关于c++ 向量的 size() 和 capacity()的主要内容,如果未能解决你的问题,请参考以下文章