【问题标题】:cbegin()/cend() vs constBegin()/constEnd()cbegin()/cend() 与 constBegin()/constEnd()
【发布时间】:2015-09-03 10:07:21
【问题描述】:

Qt 5.0 在 QListQMap 等不同的容器类中引入了迭代器方法 cbegin()cend()

但在这些类中也有 constBegin()constEnd() 方法。

所有这些方法都是 const 并返回 STL 样式的 const_iterator

  • cbegin()/cend() 是否具有与constBegin()/constEnd() 相同的功能?对我来说似乎是这样,但QListQMapcontainer classes 的文档中没有说明任何内容。
  • 是否存在应该使用cbegin()/cend() 而不是constBegin()/constEnd() 或反之亦然的情况?

【问题讨论】:

  • 检查来源,Luke...QListQMap 等(TL;DR:它们是相同的)
  • @peppe 好点。但是当文档中没有说明它们是相同的时,谁保证它们将来会保持相同?
  • 行为改变会破坏如此多的代码,以至于不可能发生。

标签: c++ qt iterator qt5


【解决方案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 风格。

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 2020-10-26
    • 2021-03-30
    • 2014-10-20
    • 1970-01-01
    • 2011-08-14
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多