为什么像QList和QVector这样的Qt容器没有迭代器范围构造函数?

时间:2016-07-08 08:20:24

标签: qt iterator-range

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

所以问题出现了,为什么Qt容器没有这个过载?这是一个疏忽还是这个笨重的设计选择背后有原因?

2 个答案:

答案 0 :(得分:5)

除了“迄今为止没有人实现它们”之外没有任何理由,因为Qt项目没有无限的开发带宽。

说到这些缺失的功能,你可以这样说:

  • 由于隐式共享,您无法在Qt容器中存储仅移动类型;
  • 缺乏安置功能(及其即将推出的关联容器试用版);
  • 缺少rvalue-overloaded函数(no QList::push_back(T &&));
  • QList在STL中没有等同物并且是一个非常奇怪的怪物,有严重的性能问题。现在已经承认,从来没有在Qt中使用过“好的通用容器”;
  • 无异常安全保证;

等等。

这些天有很多讨论(见this thread)关于与STL容器相比Qt容器的不良状态,以至于我们开始在Qt自己的实现中使用STL容器。

除非您有使用Qt的特定原因(比如,您需要将它们传递给Qt-ish API,或者您喜欢/需要隐式共享等),所以现在STL容器比Qt容器更好。

答案 1 :(得分:0)

Qt容器中缺少STL容器的几个功能。您可以在Marc Mutz here的博客中找到对它们的精彩评论。

我认为,计划是用qCopyhttp://doc.qt.io/qt-4.8/qtalgorithms.html替换构造中使用迭代器范围的特征。在Qt 5中,Qt中出现了许多用于包含的iteratorconst_iterator特征,并且QList和QVector的适当构造函数也可能出现在更高版本中(未公布,只是一个想法)。