3

C++ 中的标准库容器具有采用迭代器范围的构造函数。当输入容器的内容可转换为但与结果容器中的内容不同,或者即使容器只是不同时,这很方便。构造函数重载允许这种类型的转换发生在周围类的构造函数中,从而减少代码中的混乱。

那么问题来了,为什么 Qt 容器没有这种过载?是疏忽还是这种笨拙的设计选择背后有原因?

4

2 回答 2

7

除了“到目前为止没有人实现它们”之外没有其他原因,因为 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。

于 2016-07-08T09:01:44.333 回答
0

STL 容器有几个 Qt 容器所缺乏的特性。您可以在此处的 Marc Mutz 博客中找到对它们的精彩评论。

在我看来,该计划是用http://doc.qt.io/qt-4.8/qtalgorithms.htmlqCopy替换构造中使用迭代器范围的功能。在 Qt 5 中,Qt 中出现了许多容器功能,并且可能适合 QList 和 QVector 的构造函数也可能出现在以后的版本中(未公布,只是一个想法)。iteratorconst_iterator

于 2016-07-08T08:44:06.913 回答