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
相关产品推荐
相关产品推荐

