C ++:在向量中插入啥 - 指针或引用,向量何时复制它的元素?

Posted

技术标签:

【中文标题】C ++:在向量中插入啥 - 指针或引用,向量何时复制它的元素?【英文标题】:C++: What to insert in vectors - pointers or references, when does a vector copy it's elements?C ++:在向量中插入什么 - 指针或引用,向量何时复制它的元素? 【发布时间】:2011-11-24 15:04:22 【问题描述】:

假设我有复杂的对象,比如包含大量成员的结构 - 我想将它们存储在一个向量中。

现在 vector::push_back(...) 工作在按引用调用(而不是按值调用)上,因此在第一时间不会复制传递的对象。但是以后呢?向量内部是否存储指针或直接引用?当向量需要扩展时,是复制包含的元素本身还是它们的地址?

这最终导致了一个问题,如果 - 对于大型对象 - 对象本身应该存储在向量中,或者更确切地说是指向这些对象的指针。有没有一种最佳做法?

【问题讨论】:

***.com/questions/6349322/… <vector> 的可能重复使用您的对象复制构造函数,因此请确保定义一个 【参考方案1】:

std::vector::push_back 保存对象的副本

如果您需要通过避免复制来提高性能,那么您可以使用指针向量。

std::vector<BigObject*> objects; //manage memory yourself

或者您可以使用某种智能指针,以避免自己管理内存。 例如,如果您的编译器支持,您可以使用std::unique_ptr

std::vector<std::unique_ptr<BigObject>> objects;

如果你使用指针(或智能指针),那么复制仍然存在,但是这一次,复制是为指针(或智能指针)完成的,这要便宜得多。

来自@Loki 的评论:

或者您可以使用boost::ptr_vector&lt;&gt;,它旨在保存指针并在访问时返回引用,因此可以轻松使用标准算法,因为它们都期望对象。

【讨论】:

在您的第一个示例中,shared_ptr 可能比裸的更好 如果没有拥有对象,那么指针很好,但我更喜欢使用 boost::ptr_vector (而不是向量 os 智能指针),因为它旨在保存指针并将返回访问时引用,因此可以轻松使用标准算法,因为它们都期望对象。 +1 对于unique_ptr,而不是像大多数人喜欢做的那样到处都用shared_ptrs 发送垃圾邮件。【参考方案2】:

vector::push_back(...) 通过引用调用(而不是按值调用)工作,因此在第一时间不会复制传递的对象

vector::push_back() 存储要添加到其中的对象的副本。

向量内部是否存储指针或直接引用?

向量如何在内部存储元素是一个实现细节,但复杂性和行为要求几乎没有变化的余地。 Vector 将元素存储在与数组非常相似的连续内存位置中。

当向量需要扩展时,是复制包含的元素本身还是它们的地址?

当向量扩展时,它需要将所有对象复制到一个新的连续内存中,这也是一个实现细节。如果元素是指针,则指针本身将被复制。

对象本身应该存储在向量中,或者更确切地说是指向这些对象的指针。有没有一种最佳做法?

如果您的对象较大并且您不想将它们放在向量中,那么您可以将指向它们的指针存储在向量中,但不要将原始指针存储在向量中,请使用合适的 smart pointer强>根据您的要求。它确保完美的 RAII 并且您无需显式地为内存管理而烦恼。

【讨论】:

【参考方案3】:

实际上,如果您对向量的迭代次数多于向其添加对象的次数,则添加对象将大大优于指针,因为它们在内存中是连续的。

但是,如果您对向量进行更多的添加和擦除操作,而不是在向量上进行迭代,那么指针将更有效率。

【讨论】:

以上是关于C ++:在向量中插入啥 - 指针或引用,向量何时复制它的元素?的主要内容,如果未能解决你的问题,请参考以下文章

指向另一个类 c++ 中对象向量的指针

C 下标值不是数组、指针或向量 - 是吗?

是否使用指针或引用来访问向量,然后遍历它缓存不友好?

如何在c ++中检索向量内的对象

何时使用向量中的对象以及何时使用指向向量中对象的指针? [关闭]

在指针向量c ++中存储新对象