我正在使用 STL 库,我的目标是尽量减少数据重新分配的情况。我想知道,是吗
std::vector::assign(size_type n, const value_type& val)
如果大小未更改或实际上只是分配新值(例如,使用operator=),则重新分配数据?
http://www.cplusplus.com/上的 STL 文档说明如下 (C++98):
在填充版本 (2) 中,新内容是 n 个元素,每个元素都初始化为 val 的副本。如果发生重新分配,则使用内部分配器来分配所需的存储。
调用之前容器中保存的任何元素都将被销毁并替换为新构造的元素(不会发生元素分配)。当且仅当新向量大小超过当前向量容量时,这会导致已分配存储空间的自动重新分配。
“没有发生元素分配”这句话让一切变得有点混乱。
例如,我想要一个类向量(例如 OpenCV 的 cv::Vec3i)。这是否意味着
编辑:在这种情况下使用 allocate 的全部目的是将向量中的所有值设置为 0 (如果我有 std::vector< cv::Vec3i > v)。它将进行很多很多次。std::vector 本身的大小不会改变。
我想做的(以更简短的方式)如下:
for(int i=0; i<v.size(); i++)
for(int j=0; j<3; j++)
v[i][j] = 0;
Run Code Online (Sandbox Code Playgroud)
现在我对C++98感兴趣
std::vector.assign(...)如果不需要增长向量,则不会重新分配该向量。尽管如此,它仍然必须复制实际的元素。
如果您想了解标准保证什么,请查看标准:C++11 标准加上细微的编辑更改。