resize()和reserve()的区别是什么?

What is difference between resize() and reserve()?

本文关键字:是什么 区别 reserve resize      更新时间:2023-10-16
#include<iostream>
using namespace std;
#include<vector>
#include "s.h"

template<class T> 
void f(vector<T> a)
{
    cout << "size  " << a.size() << endl;
    cout << "capacity  " << a.capacity() << endl << endl;
}

int main()
{
    vector<int> s(10,5);
    f(s);
    s.resize(50);
    f(s);
    s.reserve(150);
    f(s);
    return 0;
}

我认为resize()改变大小,reserve()改变容量,但在我的例子中reserve()不改变容量,为什么?我的第二个问题是——assign()的含义是什么?我可以用operator=()做同样的事情吗?

// 10 10
// 50 50 
// 50 50

当您将vector传递给函数时,您正在创建vector的副本。更改f的定义以通过引用传递向量,您将看到它的行为如您所期望的那样:

void f(const vector<T>& a)

打印

size  10
capacity  10
size  50
capacity  50
size  50
capacity  150

复制向量复制其内容。容量不被认为是向量内容的一部分。因为你的f函数复制了它的参数,你没有传递实际的向量;你在传递一份拷贝。容量设置为实现定义值的副本。

reserve(...)的调用实际上可能正在工作,但您只是不知道它。当你调用函数

void f(vector<T> a)

你正在复制你的原始向量到新的向量a;此时,我怀疑标准库创建了一个具有最小容量的向量。如果您尝试将函数的签名更改为

void f(vector<T> const& a)

您可能会看到期望的结果,因为函数将在原始vector对象上操作,而不是在其副本上操作。

reserve()总是增加容量,而resize()可以做任何事情,包括破坏数据,并且在某种程度上是危险的。对于小于实际大小的容量调用reserve()可能不会引起任何问题,也不会引起更改,而对于小于大小的值调用resize()只会裁剪数据或使用大于实际大小的值调用resize()当然会增加向量大小本身