我有一個列表;如何使用迭代器達到列表項的值?
list<Car*>* carList = new list<Car*>;
但是,當我嘗試到達元素的屬性應用程序停止運行。
list<Car*>::iterator i = CarList->end();
while(i!=carList->begin())
{
string plate = (*i)->Plate;//Here app stops
i--;
}
我有一個列表;如何使用迭代器達到列表項的值?
list<Car*>* carList = new list<Car*>;
但是,當我嘗試到達元素的屬性應用程序停止運行。
list<Car*>::iterator i = CarList->end();
while(i!=carList->begin())
{
string plate = (*i)->Plate;//Here app stops
i--;
}
這不是迭代器的工作方式。你從開始到結束或rbegin迭代到撕裂。您的代碼最多會導致無限循環,並且很可能會導致段錯誤。另外,你需要存儲指針嗎?您可能可以存儲副本。
std::list<Car> cars;
//insert a few cars
for (std::list<Car>::iterator it = cars.begin(), end = cars.end(); it != end; ++it) {
std::cout << it->plate << std::endl;
}
的代碼幾乎是完全相同的反向迭代:
for (std::list<Car>::reverse_iterator it = cars.rbegin(), end = cars.rend(); it != end; ++it) {
std::cout << it->plate << std::endl;
}
與指針的工作有點,而不是複雜化,但不是太嚴重:
std::list<Car*>* cars = new std::list<Car*>;
//insert a few Car*
for (std::list<Car*>::iterator it = cars->begin(), end = cars->end(); it != end; ++it) {
std::cout << (*it)->plate << std::endl;
}
無雖然看到更廣泛的上下文,但我的猜測是,您不必要地使用動態內存分配。
要結束迭代開始使用反向迭代器:
list<Car*>::reverse_iterator i = CarList->rbegin();
list<Car*>::reverse_iterator end = CarList->rend();
while(i!=end)
{
string plate = (*i)->Plate;//Here app stops
++i;
}
你應該從迭代到rbegin
rend
。
如果你仍然想使用begin
和end
,您可以執行以下操作:
list<Car*>::iterator i = CarList->end();
while(i!=AracList->begin())
{
i--;
string plate = (*i)->Plate;//Here app stops
}
其實,end
指向一個位置您的列表的實際結束後,這就是爲什麼你可以」直接取消分配end()
。
您的代碼甚至不會低於行編譯:
list<Car*> carList = new list<Car*>;
^^^ carList is not a pointer, you can't new it
建議你存儲在列表
List<Car> cars;
Car car1;
cars.push_back(car1);
for (auto it = cars.begin(), end = cars.end(); it != end; ++it) {
std::cout << it->plate << std::endl;
}
租車對象如果您存儲在車表指針(您可能需要存儲的指針對於多態性的原因,派生自Car的類也可以存儲在列表中),但我建議你將共享指針存儲在std :: list中。
C++11
std::list<std::shared_ptr<Car*>> Cars;
C++03:
std::list<std::shared_ptr<Car*> > Cars;
^^ you need a space to differentiate from operator >>
的問題是,容器end
函數返回一個超出實際結束。這就是爲什麼你的程序崩潰。或者使用其他答案所建議的rbegin
/rend
函數,或者在之前放置i--
訪問迭代器。
我懷疑你甚至可以編譯你的代碼。 – billz
什麼是AracList? – juanchopanza
對不起,我將aracList修正爲carList。 – Baran