【发布时间】:2017-04-11 22:22:42
【问题描述】:
假设我有两个向量,src 和 dst,我想将 src 附加到 dst 的末尾。
我注意到有关此任务的大多数答案都建议这样做:
dst.insert(dst.end(),
std::make_move_iterator(src.begin()),
std::make_move_iterator(src.end()));
关于这个:
dst.insert(dst.end(), src.begin(), src.end());
据我所知,在这两种情况下,将元素推送(插入)到向量都需要为向量末尾的插入元素分配空间,以确保内存连续性,我假设 copy 和 @在这种情况下,987654328@ 成本是相同的。
移动对象会使它们立即销毁,这是这样做的唯一好处,还是我还缺少其他东西?
编辑: 你能解释一下这两种情况吗:
- 向量包含纯数据,例如:int。
- 向量包含类对象。
【问题讨论】:
-
这两行不等价 - 在第一种情况下,插入后您将无法使用
src中的项目。在这两种情况下,您都将为向量分配内存,但第一个版本将移动项目,而第二个版本将复制它们,并且移动比复制便宜 - 如果您的项目是大(例如向量),这将产生巨大的影响。 -
搬家通常比复制便宜。为什么这令人惊讶?
-
是的,添加元素总是需要更多空间。但是进程的内存占用只会为向量增加,如果每个元素都持有指向某个非常大状态的指针,则不会增加。
-
我试图理解为什么移动它们更有效..我在这两种情况下都再次分配内存?
-
@Baraa 您正在为向量单元分配内存,而不是项目管理的内存。如果您的向量包含
string,您将需要在这两种情况下分配n单元格,但如果您移动,您将只复制char*和int(假设基本实现),而如果您复制您将需要重新分配一个新的char数组并复制每个n字符串的内容。