QHash удаление указанной позиции до конца QHash и соответственно обновление QList - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть функция, которая после применения разбивает QHash до конца из заданной позиции и должна соответствующим образом обновить сопровождающий QList, чтобы отразить изменение QHash.QHash хранится как QHash<QString(Train ID), int(position of train)> для быстрого поиска.QList хранит как QList в виде списка указателей на объекты.Данный заголовок для этой функции: QList<FreightCar*> splitTrain(int pos) и не может быть изменен (т.е. может использоваться только как есть в заголовке).Я получил функцию для удаления только заданного значения «pos» и не перебирает QHash с циклом For с итератором.После 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

Функция разделения должна удалять все значения / объекты из заданной позиции до конца.Таким образом, все значения от начала до предоставленной позиции должны быть сохранены.

Каждый объект (Грузовой вагон) в грузовом поезде создается в физическом порядке.Каждому грузовому вагону присваивается идентификатор, присвоенный вес (тоннаж) и назначенный тип (BOXCAR, GONDOLACAR, TANKCAR, FLATBEDCAR).«Вальпос» относится к порядку, в котором каждая машина была создана 1,2,3,4,5 и т. д.«keyid» относится к идентификатору грузового вагона в физическом заказе QList.

1 Ответ

0 голосов
/ 18 сентября 2018

Получил это, скопировав / вставив начальный цикл, который запускается через QHash, чтобы снова запустить через цикл, чтобы удалить следующие значения, так как QHash такой же, как QMap, значения не сохраняются так же, как массив, таким образом, вы зацикливаетесьмимо определенных значений.

...