【问题标题】:How to truncate/resize a QList<> properly如何正确截断/调整 QList<> 的大小
【发布时间】:2019-11-21 09:47:00
【问题描述】:

在阅读了Why doesn't QList have a resize() method?等这里的一些问题后,我想知道以下问题。

通常,在 STL 代码中,我可以有这样的东西来限制 results 处理的大小:

std::list<int> results = something()
results.resize(std::min(result.size(), 5000));

现在我有一个带有 QList 的 Qt 项目:

QList<int> results = something()
while(results.size() > 5000) {
    results.removeLast();
}
expensiveOperation(results);

这真的是使用 Qt 容器 QList 的最佳方法吗? 原因是我最终需要将它传递给期望 QList 的框架函数。

【问题讨论】:

    标签: qt size limit qlist


    【解决方案1】:

    QList != std::listQLinkedList 更像是标准。版本。对于大多数操作,QVector 优于 QList 作为 Qt 中使用的容器类型。阅读https://marcmutz.wordpress.com/effective-qt/containers/ 以获得完整的解释。

    如果你因为某种原因被QList 卡住了......那么是的...... :( 可能使用QList::mid() 获得一个新列表会更快。而且总是有@ 987654329@ 或 toStdList()。:)

    【讨论】:

    • 是的,我知道 QList 更像是 boost::ptr_deque,我只是认为循环是调整容器大小的一种硬性方法......我还澄清了为什么这里需要 QList。谢谢。
    • 添加了一些想法。好吧,您说过您必须将 QList 传递给函数,但是构建它的方式可能会有所不同。构建向量或链表然后转换可能会更快。
    • 我会接受您的回答,因为“不可能”。手头只有偏见,没有经验测试数据,我怀疑toVector()toStdList() 等。人。要更加昂贵的电话。当然最好的方法是通过更改为 something(int max_results) 甚至不将数据插入到列表中,但我对 QList 的行为非常好奇。
    【解决方案2】:

    怎么样:

    template<typename T>
    static void truncate(QList<T> &list, int length) {
        if (0 <= length && length < list.length()) {
            list.erase(list.begin() + length, list.end());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多