2015-09-03 57 views
5

Qt 5.0在不同容器類別(如QListQMap)中引入了迭代器方法cbegin()cend()cbegin()/ cend()vs constBegin()/ constEnd()

但是在這些類中也有constBegin()constEnd()方法。

所有這些方法都是const並返回STL風格const_iterator

  • cbegin()/cend()constBegin()/constEnd()相同的功能?對我來說似乎是這樣,但在QList,QMapcontainer classes的文檔中沒有說明。
  • 是否有人應該使用cbegin()/cend()而不是constBegin()/constEnd()或反之亦然?
+2

查看源代碼,Luke ... [QList](http://code.woboq.org/qt5/qtbase/src/corelib/tools/qlist.h.html#307),[QMap](http: //code.woboq.org/qt5/qtbase/src/corelib/tools/qmap.h.html#521)等(TL; DR:它們是相同的) – peppe

+0

@peppe好點。但是,如果文件中沒有說明它們是相同的,誰保證它們將來保持相同? –

+0

行爲變化會破壞太多的代碼,導致不可能發生。 – peppe

回答

9

cbegin() and cend()其中爲了與標準庫容器兼容而引入,它們都包含自C++ 11以來的這些函數。
Qt只是想保持它與標準庫類似的接口。 constBegin()等只是舊版本(Qt在C++ 11發佈前添加它們)。使用它們沒有區別。

我會使用constBegin()constEnd(),因爲它們更加明確和'Qt風格',但這只是我個人的偏好。對於標準容器實現的一些算法可能會使用cbegin()/cend()(因此它們在Qt中的存在 - 它們有助於重用某些代碼)。如果您希望在某些時候想要在Qt之外重用您的代碼,請使用它們。

+1

使用cbegin等。使未來可以更容易地將標準容器類型替換爲Qt類型。在我看來,Qt已經改變了對於如何做事情的想法。過去有一種只用於Qt功能的東西,但現在他們認爲:在最好的情況下使用標準功能,在最好的情況下使用Qt功能。 –

1

Qt通常提供不同的使用方法,以便程序員可以使用它們使用的樣式。

Simmilar案例與迭代器的類型。您可以使用標準庫或Java樣式迭代器中使用的標準樣式。這是爲了用戶的方便。

cbegin和constBegin的原因是simillar。此外,如果文檔沒有說明差異,那麼沒有區別。

正如你注意到的那樣。 constBegin是純粹的QtStyle,cbegin是STL風格。

相關問題