我有一个清单;
list<Car*>* carList = new list<Car*>;
但是当我尝试触及元素的属性应用程序停止运行时。
list<Car*>::iterator i = CarList->end();
while(i!=carList->begin())
{
string plate = (*i)->Plate;//Here app stops
i--;
}
答案 0 :(得分:2)
这不是迭代器的工作方式。你从开始到结束迭代或rbegin到rend。您的代码最多会导致无限循环,并且最有可能导致段错误。另外,你需要存储指针吗?你可能正在存储副本。
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 :(得分:2)
您应该从rbegin
迭代到rend
。
如果您仍想使用begin
和end
,则可以执行以下操作:
list<Car*>::iterator i = CarList->end();
while(i!=AracList->begin())
{
i--;
string plate = (*i)->Plate;//Here app stops
}
实际上,end
指向列表实际结束后的位置,这就是您无法直接释放end()
的原因。
答案 2 :(得分: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;
}
答案 3 :(得分: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 >>
答案 4 :(得分:1)
问题是容器end
函数返回超出实际结束的函数。这就是你的程序崩溃的原因。使用其他答案建议的rbegin
/ rend
函数,或者在访问迭代器之前放置i--
。