You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:51:19