在数组中移动vector:寻求无拷贝无交换的高效实现方案
最优方案:用
std::move直接转移vector资源 你完全可以通过**std::move**实现无拷贝的元素移动,这是效率最高的方案,比swap和直接拷贝都更直接。
假设你的数组是类似std::vector<YourType> m_conditions[ARR_SIZE];的固定大小数组,具体实现步骤如下:
- 从要删除的索引位置(这里是3)开始,遍历到数组倒数第二个元素
- 用
std::move将后一个vector的资源直接转移到当前位置的vector中 - 最后将数组末尾的vector重置为空,避免残留无效资源
示例代码:
constexpr size_t arr_size = std::size(m_conditions); // 从索引3开始,把后续元素往前移动一位(move转移) for (size_t i = 3; i < arr_size - 1; ++i) { m_conditions[i] = std::move(m_conditions[i + 1]); } // 重置最后一个元素,清空残留的无效资源 m_conditions[arr_size - 1] = {};
为什么这是最优的?
- 和直接拷贝比:
std::move只会转移vector内部的指针、大小、容量等元数据,不会复制任何元素,完全避免了拷贝开销 - 和
std::swap比:swap需要交换两个vector的全部元数据,而我们只需要把后一个的资源转移给前一个,不需要反向操作,步骤更简洁直接
注意事项
- 被
std::move后的vector会处于合法但未指定的状态,但因为后续循环会覆盖这些被move的元素,最后一个元素也会被重置,所以不会有问题 - 如果你的数组是动态分配的(比如用
new std::vector<YourType>[...]创建的),只需要把arr_size换成你记录的数组长度即可,逻辑完全一致
内容的提问来源于stack exchange,提问作者user20716902
相关产品推荐
相关产品推荐

