C++ 中的标准库容器具有采用迭代器范围的构造函数。当输入容器的内容可转换为但与结果容器中的内容不同,或者即使容器只是不同时,这很方便。构造函数重载允许这种类型的转换发生在周围类的构造函数中,从而减少代码中的混乱。
那么问题来了,为什么 Qt 容器没有这种过载?是疏忽还是这种笨拙的设计选择背后有原因?
C++ 中的标准库容器具有采用迭代器范围的构造函数。当输入容器的内容可转换为但与结果容器中的内容不同,或者即使容器只是不同时,这很方便。构造函数重载允许这种类型的转换发生在周围类的构造函数中,从而减少代码中的混乱。
那么问题来了,为什么 Qt 容器没有这种过载?是疏忽还是这种笨拙的设计选择背后有原因?
除了“到目前为止没有人实现它们”之外没有其他原因,因为 Qt 项目没有无限的开发带宽。
说到这些缺失的功能,您可以对以下情况说同样的话:
QList::push_back(T &&)
);QList
在 STL 中没有等效项,并且是一个非常奇怪的怪物,具有严重的性能问题。现在承认,它不应该成为 Qt 中随处使用的“良好的通用容器”;等等。
这些天有很多关于 Qt 容器与 STL 容器相比状态不佳的讨论(请参阅此线程),以至于我们开始在 Qt 自己的实现中使用 STL 容器。
除非您有使用 Qt 的特定原因(例如,您需要将它们传递给 Qt-ish API,或者您喜欢/需要隐式共享等),否则现在 STL 容器比 Qt 容器要好得多。
更新:Qt 6 中的 QList 将是一个合适的向量,而 QVector(在 Qt 6 中)将是 QList 的别名。上面的一些评论将不再适用。我没有修改答案的其余部分,因为它仍然适用于 Qt 5.15。
STL 容器有几个 Qt 容器所缺乏的特性。您可以在此处的 Marc Mutz 博客中找到对它们的精彩评论。
在我看来,该计划是用http://doc.qt.io/qt-4.8/qtalgorithms.htmlqCopy
替换构造中使用迭代器范围的功能。在 Qt 5 中,Qt 中出现了许多容器功能,并且可能适合 QList 和 QVector 的构造函数也可能出现在以后的版本中(未公布,只是一个想法)。iterator
const_iterator