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

C++自定义队列rotate方法移动队首元素至队尾结果异常排查

问题修复方案

你的队列实现核心错误集中在push_back方法的分支判断逻辑,加上初始内存未分配、扩容拷贝逻辑错误的问题,才会导致元素被覆盖、出现无意义0值。

具体错误点

  • 容量判断分支写反:当前代码在aftr != capacity(尾指针还没到数组末尾)时触发扩容,在aftr == capacity(尾指针触达数组上限)时才做数据搬移,完全颠倒了触发条件。
  • 初始内存未分配:data指针初始为nullptr,第一次插入元素时没有申请初始内存,直接写入属于未定义行为,会出现随机脏值。
  • 扩容拷贝逻辑错误:原扩容代码从数组0位置开始拷贝元素,当first指针不为0时,会把已经出队的无效值拷入新数组,丢失有效元素。
  • 空队列访问无拦截:pop_front、front、back方法判断队空后仅打印日志,没有终止执行,空队列时会触发越界访问。

修正后的核心代码

首先修正push_back逻辑,补全初始内存分配,调整分支判断和拷贝逻辑:

void push_back(int value)
{
    // 首次插入先分配初始容量内存
    if (data == nullptr) {
        data = new int[capacity];
    }
    if (aftr == capacity)
    {
        if (counter < capacity)
        {
            // 尾指针到末尾但数组没满,搬移有效数据到数组头部
            for (int i = 0; i < counter; i++)
            {
                data[i] = data[first + i];
            }
            first = 0;
            aftr = counter;
        }
        else
        {
            // 数组真的存满时才触发2倍扩容
            capacity = capacity * 2;
            int *tmp = new int[capacity];
            // 从first位置开始拷贝所有有效元素
            for (int i = 0; i < counter; i++)
                tmp[i] = data[first + i];
            delete[] data;
            data = tmp;
            first = 0;
            aftr = counter;
        }
    }

    data[aftr] = value;
    aftr++;
    counter++;
}

然后补全空队列访问拦截,以pop_front为例,front、back做相同处理:

int pop_front()
{
    if (counter == 0)
    {
        std::cout << "Queue is empty" << std::endl;
        return -1; // 队空直接返回,避免后续越界访问
    }
    int value = data[first];
    first++;
    counter--;
    return value;
}

验证结果

修正后运行测试代码,输出完全符合预期:

3, 4, 5, 6, 7,
4, 5, 6, 7, 3,
5, 6, 7, 3, 4,

内容的提问来源于stack exchange,提问作者realayna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:57:31