这个问题在这里已有答案:
#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()不会改变capasity,为什么?我的第二个问题 - assign()的含义是什么?我可以用operator =()做同样的事吗?
// 10 10
// 50 50
// 50 50
当您将向量传递给函数时,您正在创建向量的副本。更改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)
你可能会看到你期望的结果,因为该函数将在原始矢量对象而不是副本上运行。
reserve()总是增加容量,而resize()可以做任何事情,包括以某种方式破坏你的数据及其危险。调用reserve()以获得比实际大小更小的容量可能不会导致任何问题,也不会改变,而调用大小小于大小的resize()只会裁剪您的数据或调整大小高于实际大小的值增加矢量大小本身的课程