我有一个清单;
list<Car*>* carList = new list<Car*>;
但是当我尝试到达元素的属性应用程序停止运行。
list<Car*>::iterator i = CarList->end();
while(i!=carList->begin())
{
string plate = (*i)->Plate;//Here app stops
i--;
}
这不是迭代器的工作方式。您从开始到结束或重新开始进行迭代。您的代码最多会导致无限循环,并且很可能会导致段错误。另外,你需要存储指针吗?您可能正在存储副本。
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;
}
虽然没有看到更广泛的背景,但我的猜测是您不必要地使用动态内存分配。
rbegin
您应该从to迭代rend
。
如果您仍想使用begin
and end
,您可以执行以下操作:
list<Car*>::iterator i = CarList->end();
while(i!=AracList->begin())
{
i--;
string plate = (*i)->Plate;//Here app stops
}
实际上,end
指向列表实际末尾之后的一个位置,这就是您不能end()
直接释放的原因。
要从头到尾迭代,请使用反向迭代器:
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 >>
问题是容器end
函数返回一个超出实际结束的值。这就是你的程序崩溃的原因。要么使用其他答案提出的rbegin
/函数,要么在访问迭代器之前放置。rend
i--