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

5 に答える 5

2

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()

于 2012-11-17T11:21:50.107 に答える
2

それはイテレータの仕組みではありません。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;
}

ただし、より広いコンテキストを確認しなくても、動的メモリ割り当てを不必要に使用していると思います。

于 2012-11-17T11:18:44.903 に答える
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;
}
于 2012-11-17T11:20:53.713 に答える
1

あなたのコードは以下の行でもコンパイルされません:

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 >>
于 2012-11-17T11:21:57.677 に答える
1

問題は、コンテナー関数が実際の末尾を超えて 1 をend返すことです。それがあなたのプログラムがクラッシュする理由です。他の回答で提案されているように/関数を使用するか、イテレータにアクセスする前に配置します。rbeginrendi--

于 2012-11-17T11:21:59.293 に答える