首页 > 解决方案 > C ++:移动矢量而不是复制和清除

问题描述

考虑到我有一个伪代码

std::vector< Something > myVector;

while (someCondition) {
    // Populate vector

    functionThatNeedsCopyOfVector(myVector);
    myVector.clear()
};

关键是这个片段实现了多次“重用”同一个向量对象的模式,它总是用一些元素填充它,然后将向量的副本传递到某个地方,然后清除它并重新开始。

考虑到这一点,我认为原则上应该可以优化这个片段以

std::vector< Something > myVector;

while (someCondition) {
    // Populate vector

    functionThatNeedsCopyOfVector(std::move(myVector));
};

(假设有一个functionThatNeedsCopyOfVector接受右值引用的重载)

然而,这显然是 UB(本身)的移动后使用的情况。但是我想知道标准是否会规定向量的移动构造函数的行为方式,以及它是否会包含一些东西,例如使原始向量等于新构造的向量(因为内部数据结构被移动了)?

如果有这样的保证,那么“move-snippet”不应该是UB,对吧?

如果它确实是 UB:是否有一种模式可以用来避免(看似)不需要的副本,但无论如何都要在之后清除它?

标签: c++vectorundefined-behavior

解决方案


推荐阅读