我有这个:
for (list<Docente>::iterator it3 = ((*it2).getDocentes()).begin(); it3 != ((*it2).getDocentes()).end(); it3++)
这((* it2).getDocentes)返回一个Docentes列表。那么为什么说列表迭代器不兼容呢?有什么帮助吗?
方法getDocentes():
list <Docente> getDocentes() const;
list <Docente> EdicaoDisciplina :: getDocentes() const
{
return docentes;
}
错误:
表达式:列表迭代器不兼容
答案 0 :(得分:5)
您没有提供足够的信息。
如果你得到关于不兼容迭代器的典型MS Visual C ++运行时断言,那么我怀疑你的getDocentes()
按值返回列表 ,即它返回一个临时副本原装容器。这意味着在一个临时副本上调用begin()
,在完全不同的临时副本上调用end()
。这使得由begin()
和end()
返回的迭代器不兼容,因为比较指向不同容器的迭代器是非法的。某些运行时库的调试版本可以捕获此类错误并发出运行定时器断言失败。
由于*it2
按值返回结果,因此甚至可能更早发生同样的问题。
编辑:正如我猜测的那样,您的getDocentes()
会按值返回结果。这几乎毫无意义,灾难性的效率低下。像列表这样的重型对象不应该按值传递。通过引用返回
const list <Docente>& EdicaoDisciplina :: getDocentes() const
{
return docentes;
}
现在你必须使用const_iterator
代替iterator
(并且丢失所有这些过多的()
对
for (list<Docente>::const_iterator it3 = it2->getDocentes().begin();
it3 != it2->getDocentes().end();
++it3)
...
最后,在每次迭代中评估it2->getDocentes().end()
都不是一个好主意
for (list<Docente>::const_iterator
it3 = it2->getDocentes().begin(),
it3_end = it2->getDocentes().end();
it3 != it3_end;
++it3)
...
答案 1 :(得分:1)
每次调用getDocentes()时,您都会返回一个新列表,并且无法有效地比较不同STL容器中的迭代器。
在你的情况下,当你调用getDocentes()。begin()时会有一个返回的列表,然后当你调用getDocentes()时,会有一个为每个循环迭代创建的新列表.end()。< / p>
你可以使用基于范围的for循环,如果你有C ++ 11,或者你可以在输入循环之前缓存开始和结束迭代器:
list <Docente> myDocentes(getDocentes());
list <Docente>::iterator begin = myDocentes.begin();
list <Docente>::iterator end = myDocentes.end();
for(list<Docente>::iterator i = begin; i != end; i++) { .... }
或者,只需使用基于的范围:
for(auto &it : getDocentes()) { ... }