问题描述
我进行了一项测试,以比较QVector
和QList
的插入/排序效果与以下代码:
#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();
});