【问题标题】:How to use QList with std::generate?如何将 QList 与 std::generate 一起使用?
【发布时间】:2020-12-13 21:31:37
【问题描述】:

我运行了一个测试来比较 QVectorQList 插入/排序性能与此代码:

#include <algorithm>
#include <iostream>

#include <boost/timer/timer.hpp>

#include <QVector>
#include <QList>

int  main()
{
  constexpr auto  size = 10000000ul;

  srand(time(nullptr));

  std::cout << std::endl;
  std::cout << "-------------------------------------------------------------------------" << std::endl;
  std::cout << std::endl;

  {
    std::cout << "First test with QVector<int>" << std::endl;
    boost::timer::auto_cpu_timer  _g;
    QVector<int>                  vector(size);

    {
      std::cout << "\t Generating:" << std::endl << "\t\t";
      boost::timer::auto_cpu_timer  _;

      std::generate(std::begin(vector), std::end(vector), []
      {
        return clock() % rand();
      });
    }
    std::cout << std::endl;

    {
      std::cout << "\t Sorting:" << std::endl << "\t\t";
      boost::timer::auto_cpu_timer  _;

      std::sort(std::begin(vector), std::end(vector));
    }
    std::cout << std::endl;
  }
  std::cout << std::endl;
  std::cout << "-------------------------------------------------------------------------" << std::endl;
  std::cout << std::endl;

  {
    std::cout << "Second test with QList<int>" << std::endl;
    boost::timer::auto_cpu_timer  _g;
    QList<int>                    list;
    list.reserve(size);

    {
      std::cout << "\t Generating:" << std::endl << "\t\t";
      boost::timer::auto_cpu_timer  _;

      std::generate(std::begin(list), std::end(list), []
      {
        return clock() % rand();
      });
    }
    std::cout << std::endl;

    {
      std::cout << "\t Sorting:" << std::endl << "\t\t";
      boost::timer::auto_cpu_timer  _;

      std::sort(std::begin(list), std::end(list));
    }
    std::cout << std::endl;
  }
  std::cout << std::endl;
  std::cout << "-------------------------------------------------------------------------" << std::endl;
  std::cout << std::endl;
}

一种可能的输出:

-------------------------------------------------------------------------

First test with QVector<int>
     Generating:
         5.544336s wall, 3.240000s user + 2.250000s system = 5.490000s CPU (99.0%)

     Sorting:
         2.593883s wall, 2.550000s user + 0.010000s system = 2.560000s CPU (98.7%)

 8.157371s wall, 5.790000s user + 2.280000s system = 8.070000s CPU (98.9%)

-------------------------------------------------------------------------

Second test with QList<int>
     Generating:
         0.000001s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%)

     Sorting:
         0.000001s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%)

 0.000060s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%)

-------------------------------------------------------------------------

我使用QList&lt;int&gt;::reserve函数保留内存,并使用std::generate生成随机数并将其插入到QList变量中。但它什么也不做,因为QList 总是空的。

我该如何解决?

【问题讨论】:

    标签: c++ stl qlist qvector


    【解决方案1】:

    问题是reserve只分配内存,并没有设置大小。

    您可以reserve 任意数量,但大小仍然为零。

    没有QList 函数来实际设置大小。

    但是您可能可以使用例如std::back_inserter 迭代器适配器函数将元素附加到列表中。将此与reserve 结合起来,列表不必分配新内存。虽然您不能将它与std::generate 一起使用,但请改用std::generate_n

    std::generate_n(std::back_inserter(list), size, []
    {
        return clock() % rand();
    });
    

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多