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


in logical order (name):
----------------
{5,'abc',33.12} @ 0x8ff00d8
{4,'def',56.78} @ 0x8ff00c8
{6,'ghi',40.71} @ 0x8ff00e8
{2,'jkl',11.05} @ 0x8ff00a8
{1,'mno',23.67} @ 0x8ff0098
{3,'pqr',17.32} @ 0x8ff00b8


in logical order (value):
----------------
{2,'jkl',11.05} @ 0x8ff00a8
{3,'pqr',17.32} @ 0x8ff00b8
{1,'mno',23.67} @ 0x8ff0098
{5,'abc',33.12} @ 0x8ff00d8
{6,'ghi',40.71} @ 0x8ff00e8
{4,'def',56.78} @ 0x8ff00c8


in logical order (name, descending):
----------------
{3,'pqr',17.32} @ 0x8ff00b8
{1,'mno',23.67} @ 0x8ff0098
{2,'jkl',11.05} @ 0x8ff00a8
{6,'ghi',40.71} @ 0x8ff00e8
{4,'def',56.78} @ 0x8ff00c8
{5,'abc',33.12} @ 0x8ff00d8


in logical order (value, descending):
----------------
{4,'def',56.78} @ 0x8ff00c8
{6,'ghi',40.71} @ 0x8ff00e8
{5,'abc',33.12} @ 0x8ff00d8
{1,'mno',23.67} @ 0x8ff0098
{3,'pqr',17.32} @ 0x8ff00b8
{2,'jkl',11.05} @ 0x8ff00a8