【问题标题】:What is Qt's equivalent to Python's range() function, returning a QList<int>?Qt 的等价于 Python 的 range() 函数,返回一个 QList<int>?
【发布时间】:2015-12-23 20:24:55
【问题描述】:

如果没有等效功能;是否可以用一行代码干净地生成(1, 2, 3, 4, 5 ... )QList&lt;int&gt;,避免for loop 或必须编写自己的函数?

【问题讨论】:

  • 没有。只是纯粹的Qt。我只引用了 python,因为我熟悉该函数(这显然且不出所料地存在于许多不同的语言中,例如 ruby​​、postgres 等)
  • @Akiva,看看我对下面答案的编辑。
  • 我给了你一个大拇指,但你的回答需要我编写自己的函数,我的问题明确指出我试图避免。对不起:-)
  • @Akiva 我不明白这怎么会是个问题。您能解释一下为什么不能添加两行函数吗?这两个命令是您在不添加额外依赖项的情况下获得的最好的。 Qt 可以为您做很多事情,但这些人不会将任何用户可能需要的所有功能作为单独的方法添加到他们的库中。
  • 明白,但有时这些东西确实存在,只是不为他们所知。再次抱歉:-)但是在这里;我会补偿你的~

标签: python qt integer range qlist


【解决方案1】:

我不知道 Qt 容器的特殊性,但在 STL 中您可以执行以下操作:

std::vector<int> v(n); std::iota(v.begin(), v.end(), 1);

或者,如果不使用 C++11,std::generate_n(v.begin(), v.end(), my_iota(1)); 其中 my_iota 是您编写的一个函子,它只返回 n++,并在 ctor 中提供 n 的初始值。

如果 Qt 容器提供符合 STL OutputIterator 概念的迭代器,您应该可以使用 std::generate 或 std::iota。


Qt 容器(QList 和 QVector)提供可利用此功能的 STL 兼容迭代器:

#include <QDebug>
#include <QVector>
#include <numeric>

inline QVector<int> range(int start, int end)
{
    QVector<int> l(end-start+1);
    std::iota(l.begin(), l.end(), start);
    return l;
}

int main()
{
    qDebug() << range(-3, 4);
    return 0;
}

打印

QVector(-3, -2, -1, 0, 1, 2, 3, 4)

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2020-03-18
    • 2011-10-13
    • 2017-10-02
    相关资源
    最近更新 更多