リストがあります。
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
からまで繰り返す必要がありrend
ます。
begin
とを引き続き使用する場合end
は、次の操作を実行できます。
list<Car*>::iterator i = CarList->end();
while(i!=AracList->begin())
{
i--;
string plate = (*i)->Plate;//Here app stops
}
実際には、リストの実際の末尾の 1 つ後end
の位置を指します。これが、直接割り当てを解除できない理由です。end()
それはイテレータの仕組みではありません。begin から end まで繰り返すか、rbegin から rend まで繰り返します。あなたのコードはせいぜい無限ループを引き起こし、ほとんどの場合、segfault を引き起こします。また、ポインタを保存する必要がありますか? おそらくコピーを保存している可能性があります。
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;
}
あなたのコードは以下の行でもコンパイルされません:
list<Car*> carList = new list<Car*>;
^^^ carList is not a pointer, you can't new it
Car オブジェクトを List に保存することをお勧めします
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 ポインタを List に格納する場合 (ポリモーフィズムの理由でポインタを格納する必要がある場合があります。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--