如何在std :: generate中使用QList?

问题描述

我进行了一项测试,以比较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<int>::reserve函数保留内存,并使用std::generate生成随机数并将其插入到QList变量中。但是它没有任何作用,因为QList始终为空。

我该如何解决?

解决方法

问题在于reserve仅分配内存,但没有设置大小。

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

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

但是,您可能可以使用例如std::back_inserter迭代器适配器函数可将元素追加到列表。将其与reserve结合使用,列表就不必分配新的内存。尽管您无法将其与std::generate一起使用,但应改为使用std::generate_n

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...