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()的主要内容,如果未能解决你的问题,请参考以下文章

unordered_map cbegin()+ number //常量复杂度?

检查字符串是否相等

STL::map/multimap

找众数

php 学习

STL::list