2017-10-19 89 views
0

我對Qt Qlist容器有一個有趣的問題。 嘗試將QList追加到QList使我的迭代器指向內存的未知部分。將QList添加到QList <QList>

QList<int> listSmall; 
QList<QList<int>> listBig; 

for(int i = 0; i < 3; ++i) 
    listSmall.append(i); 

for(auto it = listSmall.begin(); it != listSmall.end(); ++it) 
    listBig.append(listSmall); 

條件it != listSmall.end();總是如果我將小列表添加到大。 這是爲什麼發生?

P.S. STL列表工作得很好。

+0

我沒有關於Qt的想法,但檢查此鏈接,看看u能找到有用https://stackoverflow.com/questions/41438428/qlist-iteration-using-conditions –

+0

@不幸的是,Tharushi Geethma提出的問題只是建議使用stl algorthms,但並不是說追加到QList有什麼問題。 – Ivan

+0

你只需要做'listBig.append(listSmall);'如果你想追加它,一次!? – xander

回答

3

這是Qt容器與stl-like迭代器一起使用時的已知限制。 documentation解釋它。

隱式共享對STL樣式迭代器有另一個影響:當迭代器在該容器上處於活動狀態時,您應避免複製容器。迭代器指向一個內部結構,如果你複製一個容器,你應該非常小心你的迭代器。

恐怕你將不得不尋找不同的方法來做你正在做的事情(比如使用標準列表或者迭代方式不同)。

0

TLDR:當您不更改數值時,使用cbegin()cend()

詳情:

  • 編譯器調用非const begin()end()版本,就像你問 ;如果通過const ref/pointer調用cbegin()begin() ,它可以使用const版本。
  • QList嘗試進行寫入時拷貝,並在您執行操作時共享內存 listBig.append(listSmall);
  • 在非const內下一個迭代end()有確認的本地數據 不止一次引用(比如,它是由listBig內容 已經提及)後調用 detach()其複製數據。

總而言之,這是寫時複製難以正確實施的一個很好的例子。

BugReport with answer