2014-07-04 30 views
0

[現狀]

這發生在兩個QVectorQList這裏我使用後者作爲一個例子。Qt的容器(QVector,的QList)::端()返回不能被稱爲一個迭代

測試代碼:

QList<int> test;  
for (int i=0; i<10; i++) 
    test.append(i); 

// First 
qDebug()<<"[First]"; 
qDebug()<<"Directly return:"<<test.first(); 
QList<int>::iterator itr_first = test.begin(); 
qDebug()<<"By iterator:"<<*itr_first; 

// Last 
qDebug()<<"[Last]"; 
qDebug()<<"Directly return:"<<test.last(); 
QList<int>::iterator itr_last = test.end(); 
qDebug()<<"By iterator:"<<*itr_last; //<--- ***No value can be referred from here*** 

itr_last = itr_last-1; 
qDebug()<<"By iterator(modified):"<<*itr_last; 

的輸出是:

[第一]

直接返回:0

通過迭代:0

[尾]

直接返回:9

通過迭代:-842150451

通過迭代器(修改):9

[問題]

QList::begin()不同於其返回第一項的迭代器,我不明白爲什麼​​返回一個不可用的迭代器,其中cann不被提及。這對我來說是非常煩人的,並且使我的程序有時會出問題。

這是什麼原因?它與C++對話有什麼關係?

+0

走遍列表請仔細閱讀了半開的範圍和離結束迭代器,後面'begin'的概念和'end'是到C++基礎(和好了,任何事情在編程中)。 – user657267

+0

謝謝,我有點缺乏這個背景。 – Tay2510

+0

@KubaOber我是OP,我認爲它也是重複的。我自己刪除它有意義嗎? – Tay2510

回答

2

​​返回的迭代器(類似STL-like容器中的所有end迭代器)不引用列表元素 - 它嚴格用作標記標記。解除引用永遠不會有效。

從Qt的文檔(http://qt-project.org/doc/qt-4.8/qlist.html):

​​

返回一個STL風格的迭代在列表中的最後一個項目之後指向虛構項目。

QList::last()

返回列表中最後一個項目的引用。該列表不能爲空。如果列表可以爲空,請在調用此函數之前調用isEmpty()。

+0

謝謝,雖然我期待一些討論[像這樣](http://stackoverflow.com/questions/9963401/why-are-standard-iterator-ranges-begin-end-instead-of-begin-end) – Tay2510

1

如果你讀到這裏的文檔:iterator QList::end()

你可以看到:Returns an STL-style iterator pointing to the imaginary item after the last item in the list.

你必須要考慮的是,結束元素不是一個有效的元素。您可以使用類似

for(int i = 0; i < list.size(); i++) 
{ 
    qDebug() << list.at(i); 
} 
相關問題