从指针向量中删除元素时的C++问题

问题描述 投票:0回答:1

我会尽量说得尽可能简单。请注意,我在这里花了几个小时寻找答案,也在每个维基页面上寻找答案,并且几天来我一直在努力解决这个问题。

该项目是一个单行计算器,具体有问题的代码部分是:

for (int i = 0; i < operatorPositions.size(); i++)
{
    if (toProcess.at(operatorPositions.at(i)) == "(" || toProcess.at(operatorPositions.at(i)) == ")")
    {
        int storedPosition = operatorPositions.at(i);

        for (int j = i + 1; j < operatorPositions.size(); j++)
        {
            operatorPositions.at(j)--;
        }
        
        operatorOrder.erase(operatorOrder.begin() + i);
                operatorPositions.erase(operatorPositions.begin() + i);

        toProcess.erase(toProcess.begin() + storedPosition);
    }
}

此时operatorPositions和operatorOrder是相同的。 operatorPositions 是一个 int 向量,operatorOrder 是一个 int 指针向量。

toProcess 是一个字符串向量,是在运算符和数字之间解析的输入。看起来像:

输入:5*(5+5)

要处理:5,*,(,5,+,5,)

操作员位置:1,2,4,6

为了使括号在操作顺序中具有更高的优先级,我需要从具有运算符位置的整数向量中删除一个元素,以及从指向前一个向量元素的指针向量中删除一个元素。

但是这样做会导致删除错误的元素或元素较多或较少,这很奇怪。

代码片段可以在注释//括号移除中找到。

可以使用5*(5+5)来重现

(5+5)*5 效果很好

我知道这不是最好的代码,但我正在努力学习。

我意识到了一种更好的方法,但我仍然想学习并知道那里出了什么问题。 谢谢你

c++ pointers vector char erase
1个回答
0
投票

我想你想要这个:

auto itorPos = operatorPositions.begin();
auto itorOrder = operatorOrder.begin();

while (itorPos != operatorPositions.end())
{
    if (toProcess.at(*itorPos) == "(" || toProcess.at(operatorPositions.at(*itorPos)) == ")")
    {
        int storedPosition = *itorPos;

        for (int j = i + 1; j < operatorPositions.size(); j++)
        {
            operatorPositions.at(j)--;
        }
        
        itorOrder = operatorOrder.erase(itorOrder);
        itorPos = operatorPositions.erase(itorPos);

        toProcess.erase(toProcess.begin() + storedPosition);
    }
    else
    {
        itorOrder++;
        itorPos++;
    }
}

上面的改动基本上是这样的:

  • 使用迭代器代替索引变量
  • 使用 while 循环代替 for 循环
  • 擦除时,擦除方法将返回一个更新的迭代器,该迭代器引用集合中的下一个项目
  • 不擦除时,我们自己手动递增迭代器。
© www.soinside.com 2019 - 2024. All rights reserved.