我正在使用QList并且我希望迭代器虽然它,但我从它获得的迭代器仍然失败,即使我使用auto关键字。
for( auto iter = myModel->getList().begin(); iter != myModel->getList().end(); ++iter )
{
if( (*iter)->getList().empty() )
{
if( (*iter)->getData()->getCode() == baseData->getCode() )
return true;
}
}
return false;
有谁知道为什么会发生这种情况?或者我有不同的方式使用QList :: iterator?
EIDT: 我注意到了另一件奇怪的事情。我确实看到迭代器显示(错误)0,这很奇怪,因为它实际上包含了我需要的数据。
但是,如果我编辑我的代码看起来像这样:
QList<T*> tempList = myModel->getList();
for( auto iter = tempList .begin(); iter != tempList .end(); ++iter )
{
if( (*iter)->getList().empty() )
{
if( (*iter)->getData()->getCode() == baseData->getCode() )
return true;
}
}
return false;
然后一切正常。我想这是一个解决方案,但有谁知道为什么需要像这样做?或者我只是没有看到非常重要的东西?
答案 0 :(得分:2)
我发现代码存在两个问题。
a)myModel->getList()
返回QList的副本,声明如下:
QList<T*> YourModel::getList()
你实际上应该获得访问冲突。但我不知道这是不是发生了什么。
b)如果你只依赖于Visual Studio对它的评价,那就算了吧,错了。它只是无法处理迭代器。尽管迭代器将其(错误)0表示为int,但如果取消引用,它仍将为您提供正确的数据。
如果以上都不是这种情况,请说明实际出现的问题,for循环是否一起跳过?如果是这样,我会相应地编辑我的答案。
最好的问候 d
EDIT
它与临时List对象一起正常工作的原因如下:
在使用列表的begin()
方法创建迭代器的那一刻,列表将分离其私有数据(隐式共享),这意味着它会创建自身的深层副本,因为您可以使用该迭代器更改数据。没有临时对象myModel->getList()
创建一个临时对象,该对象在创建迭代器之后立即被破坏。从迭代器上的那一刻起,无处可去。您可以尝试使用const iterator
,这个应该可以在不分离私有数据的情况下工作,因此没有问题。
另一种方法是使模型将列表作为const引用或指针返回。
另一种方法是丢弃迭代器并直接使用列表的at()
方法。在我看来,使代码更具可读性。
答案 1 :(得分:1)
myModel-&gt; getList返回什么类型?
除非您有列表,否则这一行看起来很可疑:
if( (*iter)->getList().empty() )
无论如何,这些电话本身总体看起来不错。唯一真正的解释要么取决于您的类型,要么取决于数据(或缺少数据)。您发布的代码中没有明显和明显的问题。