繁体   English   中英

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

[英]std::vector::assign - reallocates the data?

我正在使用STL库,我的目标是最小化数据重新分配的情况。 我在想,是吗?

std :: vector :: assign(size_type n,const value_type&val)

如果大小未更改或者实际上只是分配新值(例如,使用operator =),则重新分配数据?

http://www.cplusplus.com/上的STL文档sais如下(C ++ 98):

在填充版本(2)中,新内容是n个元素,每个元素都初始化为val的副本。 如果发生重新分配,则使用内部分配器分配所需的存储。

在调用之前容器中保存的任何元素都被销毁并被新构造的元素替换(不会发生元素的赋值)。 如果 - 并且仅当新的矢量大小超过当前矢量容量时,这将导致分配的存储空间的自动重新分配。

短语“没有元素的分配发生”使得这一切都有点令人困惑。

所以例如,我想要一个类的向量(例如,OpenCV的cv :: Vec3i)。 这是否意味着,那

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

编辑:在这种情况下使用assign的全部目的是将向量中的所有值设置为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;

现在我对C ++ 98感兴趣

如果不需要增长它, std::vector.assign(...)不会重新分配该向量。 但是,它必须复制实际元素。

如果您想知道标准保证什么,请查看标准: C ++ 11标准以及次要的编辑更改。

我假设你有一个载有一些数据的向量,你在它上面调用一个赋值,这将:

  1. 销毁向量的所有元素(它们的析构函数被调用)就像调用clear()
  2. 使用给定对象的n个副本填充now-empty向量,该副本必须具有复制构造函数。

因此,如果您的类分配了一些内存,您必须:

  1. 在你的拷贝构造函数中处理这个问题
  2. 在析构函数中释放它

当大小超过分配的内存(向量容量)时,会发生重新分配。 您可以通过调用reserve()来阻止这种情况。 但是我认为assign()足够聪明,可以在开始填充向量之前和清除之后分配所需的所有内存(如果这比已经分配的内存多)。

您可能希望避免重新分配,因为它们的成本,但如果您试图避免它们因为您的对象无法正常处理,那么我强烈建议您不要将它们放在向量中。

assign的语义以一种非常直接的方式定义为标准:

void assign(size_type n,const T&t);

功效:

erase(begin(), end());
insert(begin(), n, t);

这意味着首先将调用元素的析构函数。 t的副本是在元素结束的生命周期之后留下的原始存储中创建的。

要求是value_typeMoveAssignable (当erase不擦除到容器的末尾并且需要将元素移动到开头时)。

这里使用的insert重载要求value_typeCopyInsertableCopyAssignable.

无论如何,vector无视你的班级如何管理自己的资源。 这是你要照顾的。 三法则。

vector::resize方法一样,

std::vector::assign(size_type n, const value_type& val)

将每个元素初始化为“val”副本 我更喜欢使用resize因为它最大限度地减少了对象实例/破坏的数量,但它也是如此。 如果要最小化数据realloc,请使用resize ,但请记住以下内容:

虽然这样做对某些数据结构是安全的,但要注意,分配/推送包含指向动态分配数据的指针的类的元素(例如,在构造函数中使用new )可能会造成严重破坏。

如果您的类动态分配数据,那么您应该重新实现YourClass::operator=以将数据复制到新对象而不是复制指针。

希望它有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM