cbegin()/cend() 与 constBegin()/constEnd()
Posted
技术标签:
【中文标题】cbegin()/cend() 与 constBegin()/constEnd()【英文标题】:cbegin()/cend() vs constBegin()/constEnd() 【发布时间】:2015-09-03 10:07:21 【问题描述】:Qt 5.0 在 QList 或 QMap 等不同的容器类中引入了迭代器方法 cbegin()
和 cend()
。
但在这些类中也有 constBegin()
和 constEnd()
方法。
所有这些方法都是 const
并返回 STL 样式的 const_iterator
。
cbegin()
/cend()
是否具有与constBegin()
/constEnd()
相同的功能?对我来说似乎是这样,但QList、QMap 或container classes 的文档中没有说明任何内容。
是否存在应该使用cbegin()
/cend()
而不是constBegin()
/constEnd()
或反之亦然的情况?
【问题讨论】:
检查来源,Luke...QList、QMap 等(TL;DR:它们是相同的) @peppe 好点。但是当文档中没有说明它们是相同的时,谁保证它们将来会保持相同? 行为改变会破坏如此多的代码,以至于不可能发生。 【参考方案1】:cbegin()
和 cend()
的引入是为了与标准库容器兼容,这些容器自 C++11 以来都包含此类函数。
Qt 只是想让它的接口类似于标准库。
constBegin()
等只是较旧的版本(Qt 在 C++11 发布之前添加了它们)。使用它们没有区别。
我会使用constBegin()
和constEnd()
,因为它们更明确且“Qt 风格”,但这只是我个人的偏好。 cbegin()
/cend()
可能被一些为标准容器实现的算法使用(因此它们存在于 Qt 中——它们有助于重用一些代码)。如果您希望在某个时候想要在 Qt 之外重用您的代码,请使用它们。
【讨论】:
使用 cbegin 等。使将来用标准容器类型替换 Qt 类型变得更容易。在我看来,Qt 似乎也改变了如何做事的想法。曾经有一种只使用 Qt-functionality-for-everything 的心态,而现在他们说:在最好的地方使用标准功能,在最好的地方使用 Qt 功能。【参考方案2】:Qt 通常会提供不同的使用方式,以便程序员可以使用他们习惯使用的样式。
类似的情况是迭代器的类型。您可以使用标准库或 Java 样式迭代器中使用的标准样式。这是为了方便用户。
cbegin 和 constBegin 的原因是相似的。此外,如果文档没有说明差异,则没有差异。
正如你所注意到的。 constBegin 是纯 QtStyle,cbegin 是 STL 风格。
【讨论】:
以上是关于cbegin()/cend() 与 constBegin()/constEnd()的主要内容,如果未能解决你的问题,请参考以下文章