如何无需复制元素快速反转仅含2个std::vector的固定长度数组
问题解答
1. 现有实现的正确性评估
你当前的代码逻辑上是正确的,可以达到交换两个vector顺序的效果,但存在不必要的性能开销:创建临时数组m_以及后续两次赋值操作都会触发std::vector的深拷贝,拷贝成本和CGAL_Polyline内存储的点数量正相关,属于可优化的冗余操作。
2. std::reverse写法失效的原因
失效的核心原因是你使用的是C++原生固定数组,它不是STL容器类型,没有内置的begin()、end()成员方法,直接调用m.begin()会直接编译报错。
如果要使用std::reverse实现需求,你可以使用标准库提供的全局迭代器适配函数,或者直接传数组指针作为迭代器,正确写法如下:
// 写法1:使用std::begin/std::end适配原生数组 std::reverse(std::begin(m), std::end(m)); // 写法2:直接传原生指针作为迭代器范围 std::reverse(m, m + 2);
std::reverse内部会使用移动语义交换元素,不会触发vector内部数据的深拷贝,性能远高于你当前的实现。
3. 最优实现方案
因为你的数组固定只有2个元素,直接交换两个元素是最简洁高效的方案,完全满足你「不反转单个vector内部元素、无需拷贝数据」的需求:
std::swap(m[0], m[1]);
std::swap对std::vector有特化实现,仅会交换vector内部的起始指针、结束指针、容量指针三个变量,时间复杂度为O(1),没有任何额外的数据拷贝开销,是所有可行方案中效率最高的。
内容的提问来源于stack exchange,提问作者PetrasVestartasEPFL
相关产品推荐
相关产品推荐

