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

这不是迭代器的工作方式。您从开始到结束或重新开始进行迭代。您的代码最多会导致无限循环,并且很可能会导致段错误。另外,你需要存储指针吗?您可能正在存储副本。

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 回答
2

rbegin您应该从to迭代rend

如果您仍想使用beginand end,您可以执行以下操作:

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

实际上,end指向列表实际末尾之后的一个位置,这就是您不能end()直接释放的原因。

于 2012-11-17T11:21:50.107 回答
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

问题是容器end函数返回一个超出实际结束的值。这就是你的程序崩溃的原因。要么使用其他答案提出的rbegin/函数,要么访问迭代器之前放置。rendi--

于 2012-11-17T11:21:59.293 回答