3
3
using namespace std ;
4
4
5
5
6
- // compresses positions [0,n) to values [1 , n]
7
- template <typename T >
8
- void compress (T&& v, int n )
6
+ // compresses positions [0,n) to values [pos , n+pos ]
7
+ template <typename Iter >
8
+ void compress (Iter ini, Iter fim, int pos= 1 )
9
9
{
10
- vector<typename decay<decltype (v[0 ])>::type> vv (n);
11
- for (int i = 0 ; i < n; i++)
12
- vv[i] = v[i];
10
+ using T = typename decay<decltype (*ini)>::type;
13
11
12
+ vector<T> vv (fim-ini);
13
+ copy (ini, fim, vv.begin ());
14
14
sort (vv.begin (), vv.end ());
15
-
16
- for (int i = 0 ; i < n; i++)
17
- v[i] = lower_bound (vv.begin (), vv.end (), v[i]) - vv.begin () + 1 ;
15
+ vv.erase (unique (vv.begin (), vv.end ()), vv.end ());
16
+ for_each (ini, fim, [&] (T& x) {
17
+ x = lower_bound (vv.begin (), vv.end (), x)-vv.begin () + pos;
18
+ });
18
19
}
19
20
20
21
int va[] = {0 , 1000 , 2000 , 5000 , 3000 };
21
22
vector<int > v{1000 , 2000 , 5000 , 3000 };
22
23
23
24
int main ()
24
25
{
25
- compress (va+1 , 4 );
26
- compress (v, 4 );
26
+ compress (va+1 , va+ 5 , 1 );
27
+ compress (v. begin (), v. end (), 0 );
27
28
28
29
for (int i = 1 ; i <= 4 ; i++)
29
30
cout << va[i] << " " ;
30
31
cout << " \n " ;
31
32
32
33
for (int i : v) cout << i << " " ;
33
34
cout << " \n " ;
34
- }
35
+ }
0 commit comments