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

C++数组元素删除问题:基于RemoveAt函数实现按值删除遇阻

问题分析与修复方案

你的RemoveByValue函数存在几个关键问题,直接导致功能失效:

  • 循环条件错误:i < this->number_of_elements-1 会跳过数组最后一个元素,永远无法匹配检查最后一个位置的目标值。
  • 提前终止遍历:else分支里直接return false,会导致只要第一个元素不等于目标值,函数就立刻终止,完全不检查后续元素。
  • 返回值不完整:如果遍历完所有元素都没找到目标值,函数没有返回语句,会触发未定义行为。

修复后的代码

bool Array::RemoveAt(int index)
{
   if (index < 0 || index >= number_of_elements)
       return false;

   for (int i = index; i < this->number_of_elements-1; i++)
   {
      this->arr[i] = this->arr[i + 1];
   }
   this->number_of_elements--;
   return true;
}

bool Array::RemoveByValue(int value)
{
   // 修正循环条件,遍历数组所有元素
   for (int i = 0; i < this->number_of_elements; i++)
   {
       if (this->arr[i] == value) {
          this->RemoveAt(i);
          return true; // 找到第一个匹配项并删除后返回成功
       }
       // 移除else分支的return语句,避免提前终止遍历
   }
   // 遍历结束未找到目标值,返回失败
   return false;
}

额外扩展(删除所有匹配元素)

如果你的需求是删除数组中所有等于目标值的元素,而非仅第一个,需要调整遍历逻辑(删除元素后数组长度变化,索引需回退),代码示例:

bool Array::RemoveAllByValue(int value)
{
   bool removed = false;
   int i = 0;
   while (i < this->number_of_elements)
   {
       if (this->arr[i] == value) {
          this->RemoveAt(i);
          removed = true;
          // 删除后元素前移,i不递增,继续检查当前位置的新元素
       } else {
          i++;
       }
   }
   return removed;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:50:54