如何在C++中反转动态数组?请点评我的首次实现代码
如何在C++中反转动态数组?
嘿,我瞅了眼你写的反转动态数组的代码,发现核心的反转逻辑出问题啦——你现在的循环只是把原数组的元素原位置复制到新数组里,完全没实现反转的效果!咱们一步步来修正和优化它。
先说说你代码里的问题
你这段代码里的反转循环:
for (int i = m_size - 1; i >= 0; i--) newArray[i] = m_array[i];
仔细看,当i是原数组最后一个元素的索引时,你把它赋值给新数组的同一个索引位置,等于完全没调换顺序。正确的做法应该是把原数组的第i个元素,放到新数组的m_size - 1 - i的位置(或者反过来,从原数组头部遍历,放到新数组尾部)。
方案1:修复你的动态数组分配实现
如果坚持要用新分配数组的方式,修正循环逻辑就行:
bool reverse() { if (!isValid() || isReadOnly()) return false; // 分配新数组 T* newArray = new (std::nothrow) T[m_size]; if (newArray == nullptr) return false; // 修正反转逻辑:原数组第i个元素放到新数组的倒数第i+1位 for (int i = 0; i < m_size; ++i) { newArray[m_size - 1 - i] = m_array[i]; } // 清理旧数组并替换 delete[] m_array; m_array = newArray; return true; }
这样就能正确把原数组的元素倒序复制到新数组里了。不过这种方法需要额外分配和释放内存,对于大数组来说效率不算最高。
方案2:原地反转(更高效,无需额外内存)
其实完全不需要新分配数组,直接在原数组上交换首尾元素就行,直到中间位置:
bool reverse() { if (!isValid() || isReadOnly()) return false; // 原地交换首尾元素 for (int i = 0; i < m_size / 2; ++i) { std::swap(m_array[i], m_array[m_size - 1 - i]); } return true; }
这个方法只需要O(1)的额外空间,时间复杂度是O(n),比重新分配数组高效得多。如果你的类里没有std::swap,也可以手动写交换逻辑:
T temp = m_array[i]; m_array[i] = m_array[m_size - 1 - i]; m_array[m_size - 1 - i] = temp;
方案3:用C++标准库(最简洁可靠)
如果你不想自己写循环,C++标准库已经提供了std::reverse函数,直接用就行,它内部就是高效的原地反转实现:
#include <algorithm> // 需要包含这个头文件 bool reverse() { if (!isValid() || isReadOnly()) return false; std::reverse(m_array, m_array + m_size); return true; }
这种方式代码最简洁,也不容易出错,推荐优先使用标准库的实现。
内容的提问来源于stack exchange,提问作者Phil C
相关产品推荐
相关产品推荐

