为什么像 QList 和 QVector 这样的 Qt 容器没有迭代器范围构造函数?
Why do Qt containers like QList and QVector not have iterator range constructors?
C++ 中的标准库容器具有采用迭代器范围的构造函数。当输入容器的内容可转换为但与结果容器中的内容不同,或者即使容器只是不同时,这很方便。构造函数重载允许这种类型的转换发生在周围 class 的构造函数中,从而减少代码中的混乱。
那么问题来了,为什么Qt容器没有这个重载呢?是疏忽还是这种笨拙的设计选择背后有原因?
Qt 容器缺少 STL 容器的一些特性。您可以在 Marc Mutz here 的博客中找到对它们的精彩评论。
在我看来,计划是用 qCopy
、http://doc.qt.io/qt-4.8/qtalgorithms.html 替换在构造中使用迭代器范围获取的功能。在 Qt 5 中,许多 iterator
和 const_iterator
容器特性出现在 Qt 中,并且 QList 和 QVector 的适当构造函数也可能出现在以后的版本中(未宣布,只是一个想法)。
除了“到目前为止还没有人实现它们”之外没有其他原因,因为 Qt 项目没有无限的开发带宽。
说到这些缺失的功能,您可以这样说:
- 由于隐式共享,您无法在 Qt 容器中存储仅移动类型;
- 缺乏安置功能(以及它们即将推出的关联容器试用版);
- 缺少右值重载函数(没有
QList::push_back(T &&)
);
QList
在STL中没有对应物并且是一个非常奇怪的怪物,具有严重的性能问题。现在公认,它不应该成为 Qt 中到处使用的“良好的通用容器”;
- 没有任何异常安全保证;
等等。
最近(f.i。见this thread)有很多关于 Qt 容器与 STL 容器相比状态不佳的讨论,以至于我们开始使用Qt 自己的实现中的 STL 容器。
除非你有使用 Qt 的特定原因(比如,你需要将它们传递给 Qt-ish API,或者你 like/need 隐式共享等),现在 STL 容器要好得多比Qt的。
更新:Qt 6 中的 QList 将成为一个合适的向量,而 QVector(在 Qt 6 中)将成为 QList 的别名。上面的一些评论将不再适用。我没有修改答案的其余部分,因为它仍然适用于 Qt 5.15。
C++ 中的标准库容器具有采用迭代器范围的构造函数。当输入容器的内容可转换为但与结果容器中的内容不同,或者即使容器只是不同时,这很方便。构造函数重载允许这种类型的转换发生在周围 class 的构造函数中,从而减少代码中的混乱。
那么问题来了,为什么Qt容器没有这个重载呢?是疏忽还是这种笨拙的设计选择背后有原因?
Qt 容器缺少 STL 容器的一些特性。您可以在 Marc Mutz here 的博客中找到对它们的精彩评论。
在我看来,计划是用 qCopy
、http://doc.qt.io/qt-4.8/qtalgorithms.html 替换在构造中使用迭代器范围获取的功能。在 Qt 5 中,许多 iterator
和 const_iterator
容器特性出现在 Qt 中,并且 QList 和 QVector 的适当构造函数也可能出现在以后的版本中(未宣布,只是一个想法)。
除了“到目前为止还没有人实现它们”之外没有其他原因,因为 Qt 项目没有无限的开发带宽。
说到这些缺失的功能,您可以这样说:
- 由于隐式共享,您无法在 Qt 容器中存储仅移动类型;
- 缺乏安置功能(以及它们即将推出的关联容器试用版);
- 缺少右值重载函数(没有
QList::push_back(T &&)
); QList
在STL中没有对应物并且是一个非常奇怪的怪物,具有严重的性能问题。现在公认,它不应该成为 Qt 中到处使用的“良好的通用容器”;- 没有任何异常安全保证;
等等。
最近(f.i。见this thread)有很多关于 Qt 容器与 STL 容器相比状态不佳的讨论,以至于我们开始使用Qt 自己的实现中的 STL 容器。
除非你有使用 Qt 的特定原因(比如,你需要将它们传递给 Qt-ish API,或者你 like/need 隐式共享等),现在 STL 容器要好得多比Qt的。
更新:Qt 6 中的 QList 将成为一个合适的向量,而 QVector(在 Qt 6 中)将成为 QList 的别名。上面的一些评论将不再适用。我没有修改答案的其余部分,因为它仍然适用于 Qt 5.15。