resize()和reserve()的区别是什么?
What is difference between resize() and reserve()?
#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()当然会增加向量大小本身
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 这些情况有什么区别?我怎么知道什么是临时对象?
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- C++和Python之间平等含义的区别的根源是什么?
- 尾随空格是什么意思,它和空白有什么区别?
- 调试构建和发布构建、区别和用途是什么意思
- std::ifstream::in 和 std::ios::in 有什么区别?(显然是 C++ 中 std::ifstr
- 在 C++ STL 的比较函数中使用"<="符号而不是"<"符号有什么区别?
- 在头中声明变量而不是在源文件(cpp/h)中声明变量有什么区别
- "Thing thing;"和"Thing thing = Thing();"有什么区别,什么时候应该使用一个而不是另一个?
- 如果 a 是 cv::Mat 和 cv::Mat b=a.row(1),那么两个 cv::Mat 实例有什么区别
- 如果f是双精度数,f+=1和f+=1.0有什么区别吗?
- char和CString的区别和关系是什么?
- 那么,是什么区别了template(c.end(),_1)和template_back(_1)呢
- C++:按变量值而不是数字移位 ->有什么区别?