1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
#include <string>
#include <iostream>
#include <functional>
#include <algorithm>
#include <list>
#include <vector>
struct A
{
int slno ;
std::string name ;
double value ;
// ...
};
std::ostream& operator << ( std::ostream& stm, const A& a )
{ return stm << '{' << a.slno << ",'" << a.name << "'," << a.value << '}' ; }
int main()
{
// const, immutable,
const std::vector<A> seq { { 1, "mno", 23.67 }, { 2, "jkl", 11.05 }, { 3, "pqr", 17.32 },
{ 4, "def", 56.78 }, { 5, "abc", 33.12 }, { 6, "ghi", 40.71 } } ;
// indirect sort on name using reference wrappers
std::vector< std::reference_wrapper< const A > > ind_r( std::begin(seq), std::end(seq) ) ;
std::sort( std::begin(ind_r), std::end(ind_r),
[] ( const A& first, const A& second ) { return first.name < second.name ; } ) ;
// indirect sort on value using pointers
std::vector< const A* > ind_p ;
for( const A& a : seq ) ind_p.push_back( std::addressof(a) ) ;
std::sort( std::begin(ind_p), std::end(ind_p),
[] ( const A* first, const A* second ) { return first->value < second->value ; } ) ;
// indirect sort on name (descending) using iterators
using iterator = std::vector<A>::const_iterator ;
std::vector<iterator> ind_i ;
for( iterator iter = std::begin(seq) ; iter != std::end(seq) ; ++iter ) ind_i.push_back(iter) ;
std::sort( std::begin(ind_i), std::end(ind_i),
[] ( iterator first, iterator second ) { return first->name > second->name ; } ) ;
// indirect sort on value (descending) using positions in the sequence
std::vector<std::size_t> ind_n( seq.size() ) ;
std::iota( std::begin(ind_n), std::end(ind_n), 0 ) ;
std::sort( std::begin(ind_n), std::end(ind_n),
[&seq] ( std::size_t a, std::size_t b ) { return seq[a].value > seq[b].value ; } ) ;
std::cout << "in physical order:\n----------------\n" ;
for( const A& a : seq ) std::cout << a << " @ " << std::addressof(a) << '\n' ;
std::cout << '\n' ;
std::cout << "\nin logical order (name):\n----------------\n" ;
for( const A& a : ind_r ) std::cout << a << " @ " << std::addressof(a) << '\n' ;
std::cout << '\n' ;
std::cout << "\nin logical order (value):\n----------------\n" ;
for( const A* p : ind_p ) std::cout << *p << " @ " << p << '\n' ;
std::cout << '\n' ;
std::cout << "\nin logical order (name, descending):\n----------------\n" ;
for( iterator iter : ind_i ) std::cout << *iter << " @ " << std::addressof(*iter) << '\n' ;
std::cout << '\n' ;
std::cout << "\nin logical order (value, descending):\n----------------\n" ;
for( std::size_t i : ind_n ) std::cout << seq[i] << " @ " << std::addressof(seq[i]) << '\n' ;
std::cout << '\n' ;
}
|