我很好奇对一个 vector <vector<int>>
进行排序是否比对一个 vector <array <int, 3>>
进行排序慢。这个 vector
的维度是 1000000 x 3,下面是我用来实现这个问题的驱动代码:
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector <vector<int>> v(1000000, vector <int> (3));
srand(time(nullptr));
for(int i = 0; i < 1000000; ++i){
for(int j = 0; j < 3; ++j){
v[i][j] = rand();
}
}
double start = clock();
sort(v.begin(), v.end());
cout << (clock()-start)/(CLOCKS_PER_SEC/1000) << endl;
return 0;
}
使用gcc 7.5.0的命令"g++ -O3 sorting_test.cxx"编译,运行时间约为300毫秒。将
v
声明为vector <array <int, 3>>
将运行时间减少一半,约为149毫秒。然而,将
v
声明为vector <tuple<int, int, int>>
比以上两种方式表现更好,平均运行时间大约为100毫秒
。我可以在某种程度上理解为什么
array
选项比vector
选项更快(array
大小是常量表达式,而不像vector
),但我不知道为什么tuple
会胜过它们两个。有人能向我解释一下吗?填充
tuple <int, int, int>
的代码如下:srand(time(nullptr));
for(int i = 0; i < 1000000; ++i){
get <0> (v[i]) = rand();
get <1> (v[i]) = rand();
get <2> (v[i]) = rand();
}
vector
、array
和tuple
中<
运算符的定义有关。对于vector
和array
,需要使用循环来比较。而tuple
可能使用折叠操作,虽然比较次数相同,但没有循环开销。 - NathanOliver