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,或者如果您明确请求 CAPACITYCAPACITY 会增长> 通过调用reserve() 方法来增加。

【讨论】:

【参考方案2】:

来自Vector:[强调]

向量的存储是自动处理的,可以根据需要进行扩展和收缩。向量通常比静态数组占用更多空间,因为分配了更多内存来处理未来的增长。这样一个向量不需要在每次插入元素时重新分配,而只需要在额外的内存耗尽时重新分配。 可以使用 capacity() 函数查询分配的内存总量。额外的内存可以通过调用 shrink_to_fit() 返还给系统。 (C++11 起)

【讨论】:

【参考方案3】:

我知道,在每次 push_back() 之后,向量的容量会以指数幂变化,但在上面的 OUTPUT 中,有时即使插入后容量仍然保持不变。

当容量大于插入后的大小时,容量不需要,保证不改变。

此策略允许顺序推回具有恒定的复杂性(摊销)。

【讨论】:

以上是关于c++ 向量的 size() 和 capacity()的主要内容,如果未能解决你的问题,请参考以下文章

C++之vector的用法整理

利用C++类实现顺序表

C++ vector的reserve和resize详解

C++中STL的vector扩容机制

C++之string的底层简单实现!(七千字长文详解)

C++ 在 .size() 之后丢失向量元素