我有一个函数,一旦应用,它就会从给定位置将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;
};
我创建了一些对象(火车)后的程序输出:
split函数需要从给定位置删除所有值/对象直至结束。因此,需要保留从开始到提供位置的所有值。
货运单中的每个对象(货运车)都是按物理顺序创建的。为每辆货车分配一个ID,并为其分配重量(吨位)和类型(BOXCAR,GONDOLACAR,TANKCAR,FLATBEDCAR)。 “ valpos”是指每辆汽车的1,2,3,4,5 ect的创建顺序。 “ keyid”是指在物理订单QList中的货运车ID。
答案 0 :(得分:0)
通过复制/粘贴通过QHash运行的初始循环使其再次运行以删除以下值,使其工作,以删除以下值,因为QHash与QMap相同,所以值未保存为数组,因此循环超过某些值。