0
#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
4

4 回答 4

6

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

void f(const vector<T>& a)

印刷

size  10
capacity  10

size  50
capacity  50

size  50
capacity  150
于 2013-03-26T07:26:47.900 回答
4

复制向量会复制其内容。并且容量不被视为向量内容的一部分。由于您的f函数复制了它的参数,因此您没有传递实际的向量;你正在传递一份副本。容量设置为实现定义值的副本。

于 2013-03-26T07:29:20.083 回答
3

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

void f(vector<T> a)

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

void f(vector<T> const& a)

您可能会看到您期望的结果,因为该函数将在原始向量对象而不是副本上运行。

于 2013-03-26T07:28:40.163 回答
1

reserve() 总是增加容量,而 resize() 可以做任何事情,包括以某种方式破坏您的数据及其危险。调用 reserve() 以获得比实际大小更小的容量可能不会导致任何问题或更改,而使用小于大小的值调用 resize() 只会裁剪数据或使用高于实际大小的值调整大小当然会增加向量大小本身

于 2013-03-26T08:30:39.993 回答