#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' ;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDx2ZWN0b3I+CgpzdHJ1Y3QgQQp7CiAgICBpbnQgc2xubyA7CiAgICBzdGQ6OnN0cmluZyBuYW1lIDsKICAgIGRvdWJsZSB2YWx1ZSA7CgogICAgLy8gLi4uCn07CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBzdG0sIGNvbnN0IEEmIGEgKQp7IHJldHVybiBzdG0gPDwgJ3snIDw8IGEuc2xubyA8PCAiLCciIDw8IGEubmFtZSA8PCAiJywiIDw8IGEudmFsdWUgPDwgJ30nIDsgfQoKaW50IG1haW4oKQp7CiAgICAvLyBjb25zdCwgaW1tdXRhYmxlLAogICAgY29uc3Qgc3RkOjp2ZWN0b3I8QT4gc2VxIHsgeyAxLCAibW5vIiwgMjMuNjcgfSwgeyAyLCAiamtsIiwgMTEuMDUgfSwgeyAzLCAicHFyIiwgMTcuMzIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDQsICJkZWYiLCA1Ni43OCB9LCB7IDUsICJhYmMiLCAzMy4xMiB9LCB7IDYsICJnaGkiLCA0MC43MSB9IH0gOwoKICAgIC8vIGluZGlyZWN0IHNvcnQgb24gbmFtZSB1c2luZyByZWZlcmVuY2Ugd3JhcHBlcnMKICAgIHN0ZDo6dmVjdG9yPCBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPCBjb25zdCBBID4gPiBpbmRfciggc3RkOjpiZWdpbihzZXEpLCBzdGQ6OmVuZChzZXEpICkgOwogICAgc3RkOjpzb3J0KCBzdGQ6OmJlZ2luKGluZF9yKSwgc3RkOjplbmQoaW5kX3IpLAogICAgICAgICAgICAgICBbXSAoIGNvbnN0IEEmIGZpcnN0LCBjb25zdCBBJiBzZWNvbmQgKSB7IHJldHVybiBmaXJzdC5uYW1lIDwgc2Vjb25kLm5hbWUgOyB9ICApIDsKCiAgICAvLyBpbmRpcmVjdCBzb3J0IG9uIHZhbHVlIHVzaW5nIHBvaW50ZXJzCiAgICBzdGQ6OnZlY3RvcjwgY29uc3QgQSogPiBpbmRfcCA7CiAgICBmb3IoIGNvbnN0IEEmIGEgOiBzZXEgKSBpbmRfcC5wdXNoX2JhY2soIHN0ZDo6YWRkcmVzc29mKGEpICkgOwogICAgc3RkOjpzb3J0KCBzdGQ6OmJlZ2luKGluZF9wKSwgc3RkOjplbmQoaW5kX3ApLAogICAgICAgICAgICAgICBbXSAoIGNvbnN0IEEqIGZpcnN0LCBjb25zdCBBKiBzZWNvbmQgKSB7IHJldHVybiBmaXJzdC0+dmFsdWUgPCBzZWNvbmQtPnZhbHVlIDsgfSAgKSA7CgogICAgLy8gaW5kaXJlY3Qgc29ydCBvbiBuYW1lIChkZXNjZW5kaW5nKSB1c2luZyBpdGVyYXRvcnMKICAgIHVzaW5nIGl0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8QT46OmNvbnN0X2l0ZXJhdG9yIDsKICAgIHN0ZDo6dmVjdG9yPGl0ZXJhdG9yPiBpbmRfaSA7CiAgICBmb3IoIGl0ZXJhdG9yIGl0ZXIgPSBzdGQ6OmJlZ2luKHNlcSkgOyBpdGVyICE9IHN0ZDo6ZW5kKHNlcSkgOyArK2l0ZXIgKSBpbmRfaS5wdXNoX2JhY2soaXRlcikgOwogICAgc3RkOjpzb3J0KCBzdGQ6OmJlZ2luKGluZF9pKSwgc3RkOjplbmQoaW5kX2kpLAogICAgICAgICAgICAgICBbXSAoIGl0ZXJhdG9yIGZpcnN0LCBpdGVyYXRvciBzZWNvbmQgKSB7IHJldHVybiBmaXJzdC0+bmFtZSA+IHNlY29uZC0+bmFtZSA7IH0gICkgOwoKCiAgICAvLyBpbmRpcmVjdCBzb3J0IG9uIHZhbHVlIChkZXNjZW5kaW5nKSB1c2luZyBwb3NpdGlvbnMgaW4gdGhlIHNlcXVlbmNlCiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gaW5kX24oIHNlcS5zaXplKCkgKSA7CiAgICBzdGQ6OmlvdGEoIHN0ZDo6YmVnaW4oaW5kX24pLCBzdGQ6OmVuZChpbmRfbiksIDAgKSA7CiAgICBzdGQ6OnNvcnQoIHN0ZDo6YmVnaW4oaW5kX24pLCBzdGQ6OmVuZChpbmRfbiksCiAgICAgICAgICAgICAgIFsmc2VxXSAoIHN0ZDo6c2l6ZV90IGEsIHN0ZDo6c2l6ZV90IGIgKSB7IHJldHVybiBzZXFbYV0udmFsdWUgPiBzZXFbYl0udmFsdWUgOyB9ICApIDsKCiAgICBzdGQ6OmNvdXQgPDwgImluIHBoeXNpY2FsIG9yZGVyOlxuLS0tLS0tLS0tLS0tLS0tLVxuIiA7CiAgICBmb3IoIGNvbnN0IEEmIGEgOiBzZXEgKSBzdGQ6OmNvdXQgPDwgYSA8PCAiIEAgIiA8PCBzdGQ6OmFkZHJlc3NvZihhKSA8PCAnXG4nIDsKICAgIHN0ZDo6Y291dCA8PCAnXG4nIDsKCiAgICBzdGQ6OmNvdXQgPDwgIlxuaW4gbG9naWNhbCBvcmRlciAobmFtZSk6XG4tLS0tLS0tLS0tLS0tLS0tXG4iIDsKICAgIGZvciggY29uc3QgQSYgYSA6IGluZF9yICkgc3RkOjpjb3V0IDw8IGEgPDwgIiBAICIgPDwgc3RkOjphZGRyZXNzb2YoYSkgPDwgJ1xuJyA7CiAgICBzdGQ6OmNvdXQgPDwgJ1xuJyA7CgogICAgc3RkOjpjb3V0IDw8ICJcbmluIGxvZ2ljYWwgb3JkZXIgKHZhbHVlKTpcbi0tLS0tLS0tLS0tLS0tLS1cbiIgOwogICAgZm9yKCBjb25zdCBBKiBwIDogaW5kX3AgKSBzdGQ6OmNvdXQgPDwgKnAgPDwgIiBAICIgPDwgcCA8PCAnXG4nIDsKICAgIHN0ZDo6Y291dCA8PCAnXG4nIDsKCiAgICBzdGQ6OmNvdXQgPDwgIlxuaW4gbG9naWNhbCBvcmRlciAobmFtZSwgZGVzY2VuZGluZyk6XG4tLS0tLS0tLS0tLS0tLS0tXG4iIDsKICAgIGZvciggaXRlcmF0b3IgaXRlciA6IGluZF9pICkgc3RkOjpjb3V0IDw8ICppdGVyIDw8ICIgQCAiIDw8IHN0ZDo6YWRkcmVzc29mKCppdGVyKSA8PCAnXG4nIDsKICAgIHN0ZDo6Y291dCA8PCAnXG4nIDsKCiAgICBzdGQ6OmNvdXQgPDwgIlxuaW4gbG9naWNhbCBvcmRlciAodmFsdWUsIGRlc2NlbmRpbmcpOlxuLS0tLS0tLS0tLS0tLS0tLVxuIiA7CiAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgOiBpbmRfbiApIHN0ZDo6Y291dCA8PCBzZXFbaV0gPDwgIiBAICIgPDwgc3RkOjphZGRyZXNzb2Yoc2VxW2ldKSA8PCAnXG4nIDsKICAgIHN0ZDo6Y291dCA8PCAnXG4nIDsKfQo=
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