如何使用迭代器获取列表项的值?

时间:2012-11-17 11:16:53

标签: c++ list

我有一个清单;

list<Car*>* carList = new list<Car*>;

但是当我尝试触及元素的属性应用程序停止运行时。

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

5 个答案:

答案 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

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

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