移除指定位置的QHash直到QHash结束,并相应地更新QList

时间:2018-09-17 06:52:18

标签: c++ qt qt5

我有一个函数,一旦应用,它就会从给定位置将QHash拆分到末尾,并且需要相应地更新随附的QList以反映QHash的更改。 QHash存储为QHash<QString(Train ID), int(position of train)>,以便快速查找。 QList作为对象列表的指针列表存储为QList。此函数的给定标头为:QList<FreightCar*> splitTrain(int pos),并且不能更改(即只能按原样使用标头)。 我已经获得了仅删除给定值“ pos”的函数,并且不使用迭代器的For循环遍历QHash。在QHash之后,QList将更新为QHash中的值,但不完全是这样。

这是该功能的实现。

QList<FreightCar*> FreightTrain::splitTrain(int pos)
{
    QTextStream cout(stdout);
    QHash<QString, int>::iterator i;
    QList<FreightCar*>::iterator j;

int posI;
posI = pos;
//removal of posbyid by given id onwards
        for(i = this->posByID.begin(); i != this->posByID.end(); )
        {
                  if(i.value() == posI)
                  {
                      i = this->posByID.erase(i++);
                      posI++;
                  }
                  else
                     i++;

         }
        //end of removal of posbyid by given id onwards

        //Display current values in QHash of posByID
        for(auto i = this->posByID.begin(); i != this->posByID.end(); i++)
        {
            cout << "keyid: " << i.key() << " valpos: " << i.value() << endl;
        };
        //End of display of posByID values




//removal of same ID values from QHASH posbyId in QLIST physicalorder
bool yes;
        for (auto j = this->physicalOrder.begin(); j != this->physicalOrder.end();)
        {
            yes = false;

                   for(auto i = this->posByID.begin(); i != this->posByID.end(); ++i)
                   {
                        if((*j)->getID() == i.key())
                        {
                            if(i.key() == pos)
                            {
                                yes = true;
                                break;
                            }else
                            {
                                yes = false;
                                break;
                            }
                        }else if((*j)->getID() != i.key())
                        {
                            yes = true;
                        }
                   }
                if(yes == true)
                {
                  j= this->physicalOrder.erase(j);
                }else
                {j++;};
            }//end of removal of same ID values from posbyId in physicalorder

//display of QList after deletion.
        for (auto j = this->physicalOrder.begin(); j != this->physicalOrder.end(); j++)
        {
            cout << (*j)->toString() << endl;
        }
//end of display of list after deletion.

    return *this;

};

我创建了一些对象(火车)后的程序输出:

output

split函数需要从给定位置删除所有值/对象直至结束。因此,需要保留从开始到提供位置的所有值。

货运单中的每个对象(货运车)都是按物理顺序创建的。为每辆货车分配一个ID,并为其分配重量(吨位)和类型(BOXCAR,GONDOLACAR,TANKCAR,FLATBEDCAR)。 “ valpos”是指每辆汽车的1,2,3,4,5 ect的创建顺序。 “ keyid”是指在物理订单QList中的货运车ID。

1 个答案:

答案 0 :(得分:0)

通过复制/粘贴通过QHash运行的初始循环使其再次运行以删除以下值,使其工作,以删除以下值,因为QHash与QMap相同,所以值未保存为数组,因此循环超过某些值。