I was curious to see whether sorting a vector <vector<int>>
would be slower than sorting a vector <array <int, 3>>
. The dimensions of the vector
is 1000000 by 3, and below is my driver code implementing this:
#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;
}
Compiling with g++ -O3 sorting_test.cxx
with gcc 7.5.0, I get a runtime of around 300 ms. Declaring v
as a vector <array <int, 3>>
halved the runtime to around 149 ms.
However, declaring v
as a vector <tuple<int, int, int>>
beat out both of the above options, with an average runtime of approximately 100 ms
.
I can somewhat understand why the array
option is faster than the vector
option (array
size is a constant expression, unlike the vector
), but I have no idea why the tuple
would beat both of them. Can somebody please explain this to me?
The code that fills the tuple <int, int, int>
s is
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();
}
operator <
is defined forvector
,array
, andtuple
. Withvector
andarray
you need a loop.tuple
probably uses a fold operation which while it has the same number of comparisons, does not have the loop overhead. – Doodytuple
case – Alkahest