std::vector::assign - 重新分配数据?

cof*_*fee 5 c++ stl vector

我正在使用 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)。这是否意味着

  1. cv::Vec3i 的析构函数或构造函数将被调用?
  2. 将直接复制 Vec3i 内存并填充向量?
  3. 如果我的类在运行时使用new 运算符分配内存,会发生什么?该内存不能通过普通内存复制来解释。这是否意味着 allocate() 不应该用于此类对象?

编辑:在这种情况下使用 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感兴趣

Ded*_*tor 1

std::vector.assign(...)如果不需要增长向量,则不会重新分配该向量。尽管如此,它仍然必须复制实际的元素。

如果您想了解标准保证什么,请查看标准:C++11 标准加上细微的编辑更改。