Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
class Compare
{
public:
static int num;
Compare()
{
num++;
}
Compare(const Compare& compare)
{
num++;
}
~Compare()
{
}
bool operator() (int v1, int v2)
{
return v1 < v2;
}
};
int Compare::num = 0;
int main()
{
vector<int> mas;
for(int step = 1; step <= 3; ++step){
cout << "---- step " << step << endl;
for(int size = 1; size < 1e7; size *= 2){
mas.resize(size);
for( int k = 0; k < size; k++ ) mas[k] = rand();
Compare::num = 0;
sort( mas.begin(), mas.end(), Compare() );
cout << setw(7) << size << setw(7) << setprecision(4) << ((float)Compare::num/(float)size) << endl;
}
}
return 0;
}
>g++ habrasort.cpp -o habrasort && habrasort
---- step 1
1 4
2 2
4 1
8 1
16 1.125
32 1.313
64 1.422
128 1.422
256 1.477
512 1.441
1024 1.431
2048 1.452
4096 1.448
8192 1.456
16384 1.451
32768 1.442
65536 1.437
131072 1.428
262144 1.413
524288 1.39
1048576 1.38
2097152 1.367
4194304 1.362
8388608 1.359
---- step 2
1 4
2 2.5
4 1.5
8 1.125
16 0.9375
32 1.25
64 1.391
128 1.469
256 1.406
512 1.443
1024 1.454
2048 1.444
4096 1.45
8192 1.46
16384 1.456
32768 1.449
65536 1.438
131072 1.434
262144 1.412
524288 1.39
1048576 1.38
2097152 1.368
4194304 1.362
8388608 1.359
---- step 3
1 4
2 2
4 1.5
8 1.375
16 1.063
32 1.219
64 1.359
128 1.391
256 1.395
512 1.486
1024 1.449
2048 1.462
4096 1.446
8192 1.465
16384 1.448
32768 1.443
65536 1.438
131072 1.428
262144 1.413
524288 1.39
1048576 1.381
2097152 1.367
4194304 1.362
8388608 1.359
>g++ habrasort.cpp -o habrasort -O3 && habrasort
---- step 1
1 4
2 2
4 1
8 1
16 1.125
32 1.313
64 1.422
128 1.422
256 1.477
512 1.441
1024 1.431
2048 1.452
4096 1.448
8192 1.456
16384 1.451
32768 1.442
65536 1.437
131072 1.428
262144 1.413
524288 1.39
1048576 1.38
2097152 1.367
4194304 1.362
8388608 1.359
---- step 2
1 4
2 2.5
4 1.5
8 1.125
16 0.9375
32 1.25
64 1.391
128 1.469
256 1.406
512 1.443
1024 1.454
2048 1.444
4096 1.45
8192 1.46
16384 1.456
32768 1.449
65536 1.438
131072 1.434
262144 1.412
524288 1.39
1048576 1.38
2097152 1.368
4194304 1.362
8388608 1.359
---- step 3
1 4
2 2
4 1.5
8 1.375
16 1.063
32 1.219
64 1.359
128 1.391
256 1.395
512 1.486
1024 1.449
2048 1.462
4096 1.446
8192 1.465
16384 1.448
32768 1.443
65536 1.438
131072 1.428
262144 1.413
524288 1.39
1048576 1.381
2097152 1.367
4194304 1.362
8388608 1.359
for( int k = 0; k < size; k++ ) mas[k] = 1e7 - k; — получил число, стремящееся к 5.
---- step 1
1 2
2 2
4 1
8 0.5
16 0.25
32 0.125
64 0.4375
128 0.3594
256 0.3438
512 0.3652
1024 0.373
2048 0.3711
4096 0.4006
8192 0.3885
16384 0.3855
32768 0.3741
65536 0.3645
131072 0.3445
262144 0.3098
524288 0.2511
1048576 0.1682
2097152 0.1093
4194304 0.05469
8388608 0.02734
---- step 2
1 2
2 2
4 1
8 0.5
16 0.25
32 0.125
64 0.2969
128 0.3359
256 0.3906
512 0.3789
1024 0.3701
2048 0.3916
4096 0.3936
8192 0.3824
16384 0.3782
32768 0.3759
65536 0.3668
131072 0.3447
262144 0.3085
524288 0.2512
1048576 0.1682
2097152 0.1093
4194304 0.05469
8388608 0.02734
---- step 3
1 2
2 2
4 1
8 0.5
16 0.25
32 0.125
64 0.2969
128 0.3828
256 0.4375
512 0.3652
1024 0.373
2048 0.396
4096 0.395
8192 0.385
16384 0.3817
32768 0.3804
65536 0.3666
131072 0.3458
262144 0.3095
524288 0.2514
1048576 0.168
2097152 0.1093
4194304 0.05469
8388608 0.02734
---- step 1
1 2
2 2
4 1
8 0.5
16 0.25
32 0.125
64 0.3438
128 0.4531
256 0.4141
512 0.3535
1024 0.3877
2048 0.3799
4096 0.3833
8192 0.3851
16384 0.383
32768 0.3881
65536 0.3911
131072 0.3884
262144 0.3914
524288 0.3899
1048576 0.3899
2097152 0.3896
4194304 0.3901
8388608 0.3901
---- step 2
1 2
2 2
4 1
8 0.5
16 0.25
32 0.125
64 0.2969
128 0.3359
256 0.3555
512 0.377
1024 0.4082
2048 0.3843
4096 0.3877
8192 0.3982
16384 0.3973
32768 0.39
65536 0.3889
131072 0.3894
262144 0.3907
524288 0.3897
1048576 0.3899
2097152 0.3902
4194304 0.3901
8388608 0.3899
---- step 3
1 2
2 2
4 1
8 0.5
16 0.25
32 0.125
64 0.3438
128 0.3594
256 0.3438
512 0.3945
1024 0.376
2048 0.3828
4096 0.396
8192 0.3813
16384 0.389
32768 0.3897
65536 0.3906
131072 0.3906
262144 0.3899
524288 0.3908
1048576 0.3903
2097152 0.3904
4194304 0.3897
8388608 0.3899
размер | rate | массив M
-------+------------+------------------------
1 | 4 | любой
>> 1 | 1.25 | M[i] == M[j]
>> 1 | 1.33 | M[i] < M[i+1]
>> 1 | 5 | M[i] > M[i+1]
>> 1 | около 1.39 | M[i] == i % 2 ? 10 : 11
>> 1 | около 1.34 | M[i] == i % 3 ? 10 : 11
std::copy(mas.cbegin(), mas.cend(), std::ostream_iterator<int>(std::cout, " "));
std::ostream_iterator<int>(std::cout, " ")
Compare sort_criterion;
sort( mas.begin(), mas.end(), std::cref(sort_criterion) );
const это укажет компилятору что вызов метода не изменит передаваемый экземпляр функтора и копировать его нет необходимости, он ведь все равно не изменится :)void operator() (int value) const


#include <iostream>
using namespace std;
void foo()
{
std::cout << "bar\n";
}
int main() {
(*&**&**&*&****&*foo)();
return 0;
}
Небольшое исследование по использованию функторов в стандартной библиотеке STL С++