【发布时间】:2014-01-18 14:50:41
【问题描述】:
使用reserve() 后跟push_back() 可能比调整向量大小和稍后执行分配更快——如std::vector reserve() and push_back() is faster than resize() and array index, why? 所示。
但是,如果我进行分配而不是使用push_back(),则向量的大小仍然是0:
# include <vector>
int main() {
std::vector<int> x;
x.reserve(10);
x[0] = 10, x[1] = 9, x[2] = 8, x[3] = 7, x[4] = 6;
x[5] = 5, x[6] = 4, x[7] = 3, x[8] = 2, x[9] = 1;
std::cout << x[2] << std::endl;
std::cout << "SIZE: " << x.size() << std::endl; // 'size()' is 0
x.resize(10); // removes former entries, since the vector had 'size() = 0'
std::cout << x[2] << std::endl;
std::cout << "SIZE: " << x.size() << std::endl; // 'size()' is 10,
// but values are gone
}
输出:
8
SIZE: 0
0
SIZE: 10
如何在不破坏 保留 条目的情况下更改矢量的大小?当然,我仍然想使用reserve(),以降低分配成本——我知道我需要的确切大小。
【问题讨论】:
-
请阅读文档:vector::reserve 只是为请求的数量保留容量 - 内存未初始化
-
如果你用的是c++11,可以
std::vector<int> x { 10,9,...}; -
@DieterLücking 内存未初始化,但无论如何都已分配,不是吗?还是分配给
push_back()? -
另外,如果您知道您需要的确切尺寸,为什么不使用
std::array<int, 10>?编辑:根据this,在所有其他情况下,函数调用不会导致重新分配并且向量容量不受影响。 -
@Gasim 我正在编写一个小型序列化程序。用户打包一个向量,并将其大小写入缓冲区。我知道拆包期间的确切尺寸,但我仍在处理
vector。
标签: c++ memory-management vector