2012-11-17 54 views
0

我有一個列表;如何使用迭代器達到列表項的值?

list<Car*>* carList = new list<Car*>; 

但是,當我嘗試到達元素的屬性應用程序停止運行。

list<Car*>::iterator i = CarList->end(); 
while(i!=carList->begin()) 
{ 
    string plate = (*i)->Plate;//Here app stops 
    i--; 
} 
+3

我懷疑你甚至可以編譯你的代碼。 – billz

+1

什麼是AracList? – juanchopanza

+0

對不起,我將aracList修正爲carList。 – Baran

回答

2

這不是迭代器的工作方式。你從開始到結束或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; 
} 

無雖然看到更廣泛的上下文,但我的猜測是,您不必要地使用動態內存分配。

1

要結束迭代開始使用反向迭代器:

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; 
} 
2

你應該從迭代到rbeginrend

如果你仍然想使用beginend,您可以執行以下操作:

list<Car*>::iterator i = CarList->end(); 
while(i!=AracList->begin()) 
{ 
    i--; 
    string plate = (*i)->Plate;//Here app stops 
} 

其實,end指向一個位置您的列表的實際結束後,這就是爲什麼你可以」直接取消分配end()

1

您的代碼甚至不會低於行編譯:

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 >> 
1

的問題是,容器end函數返回一個超出實際結束。這就是爲什麼你的程序崩潰。或者使用其他答案所建議的rbegin/rend函數,或者在之前放置i--訪問迭代器。