C++ STL,resize 和 reserve 的区别

结论放前边:resizereserve都可以给容器扩容,区别在于resize会进行填充,使容器处于满员的状态,即size=capacity,而reserve不会填充,有size.

1. size 和 capacity 的区别

size和capacity是容器非常重要的两个概念,capacity表示容器的容量,也就是能存储元素的上限数量,size表示容器当前存在多少元素。
所以在多数时候,size和capacity是不相等的,且满足size<=capacity。

2. resize 和 reserve 的区别

了解了size和capacity的区别,接下来就更好理解了。
回顾一下这俩函数的原型:

resize(std::size_t new_size)
reserve(std::size_t new_cap)

std::size_t不重要,当成int看就行。resize和reserve都是容器的成员函数,以obj.resize(n), obj.reseve(n)的形式来调用,如果n小于当前的size,则什么都不干;同样,如果n小于capacity,也不会进行任何操作。
如果n大于当前的size,resize函数会先扩容到n,然后将新增的空间,用默认值填充,相当于resize之后,obj是满的;如果n大于capacity,reserve函数只进行扩容,不做填充。
看个例子:

#include 
#include 

using namespace std;

class A {
public:
    A(){cout<<"A::constructor"<<endl;}
    void display(){cout<<"dispaly"<<endl;}
};

int main() {
    vector<A> v;
    v.resize(5);   //进行填充
    cout << v.capacity() << " " << v.size() << endl;

    vector<A> x;
    x.reserve(5);  //不填充
    cout << x.capacity() << " " << x.size() << endl;
}

运行结果:
C++ STL,resize 和 reserve 的区别_第1张图片可以看到,reisze扩容之后,会进行元素填充,调用了构造函数,而reserve不会。

3. 值得注意的一点

resize和reserve扩容处理的区别,带来了主要问题就是push函数使用问题,比如vector的push_back()函数,如果是resize之后再push_back,容器会继续扩容,因为这时候容器已经满了;如果是reverse之后push_back,则会放到vector现有元素的后边。

#include 
#include 

using namespace std;

class A {
public:
    A(){cout<<"A::constructor"<<endl;}
    void display(){cout<<"dispaly"<<endl;}
};

int main() {
    vector<A> v;
    v.resize(5);   //进行填充
    v.push_back(A());
    cout << v.capacity() << " " << v.size() << endl;

    vector<A> x;
    x.reserve(5);  //不填充
    x.push_back(A());
    cout << x.capacity() << " " << x.size() << endl;
}

C++ STL,resize 和 reserve 的区别_第2张图片

你可能感兴趣的:(C++相关,数据结构,c++,数据结构)