我正在使用 STL 库,我的目标是尽量减少数据重新分配的情况。
我想知道,是吗
std::vector::assign(size_type n, const value_type& val)
如果大小未更改或实际上只是分配新值(例如,使用operator=),则重新分配数据?
STL 文档位于http://www.cplusplus.com/ http://www.cplusplus.com/如下(C++98):
在填充版本 (2) 中,新内容是 n 个元素,每个元素都初始化为 val 的副本。
如果发生重新分配,则使用内部分配器来分配所需的存储。
调用之前容器中保存的任何元素都将被销毁并替换为新构造的元素(不会发生元素分配)。
当且仅当新向量大小超过当前向量容量时,这会导致已分配存储空间的自动重新分配。
“没有发生元素分配”这句话让一切变得有点混乱。
例如,我想要一个类向量(例如 OpenCV 的 cv::Vec3i)。这是否意味着,
- cv::Vec3i 的析构函数或构造函数将被调用?
- 将直接复制 Vec3i 内存并填充向量?
- 如果我的类在运行时分配内存,会发生什么new操作员?该内存不能用普通内存来解释
复制。这是否意味着, allocate() 不应该用于此类
物体?
EDIT:在这种情况下使用 allocate 的全部目的是将向量中的所有值设置为 0(如果我有 std::vector v)。它将进行很多很多次。 std::vector 本身的大小不会改变。
我想做的(以更简短的方式)如下:
for(int i=0; i<v.size(); i++)
for(int j=0; j<3; j++)
v[i][j] = 0;
现在我感兴趣的是C++98
std::vector.assign(...)
如果不需要增长向量,则不会重新分配该向量。尽管如此,它仍然必须复制实际的元素。
如果您想了解标准保证什么,请查看标准:C++11 标准加上细微的编辑更改。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)