结论放前边:resize
和reserve
都可以给容器扩容,区别在于resize
会进行填充,使容器处于满员的状态,即size=capacity
,而reserve
不会填充,有size
size和capacity是容器非常重要的两个概念,capacity表示容器的容量,也就是能存储元素的上限数量,size表示容器当前存在多少元素。
所以在多数时候,size和capacity是不相等的,且满足size<=capacity。
了解了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;
}
运行结果:
可以看到,reisze扩容之后,会进行元素填充,调用了构造函数,而reserve不会。
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;
}