#include <string>
#include <iostream>
#include <functional>
#include <algorithm>
#include <list>
#include <vector>
struct A
{
std::string str ;
double number ;
// ...
};
std::ostream& operator << ( std::ostream& stm, const A& a )
{ return stm << "{'" << a.str << "'," << a.number << '}' ; }
int main()
{
// const, immutable,
const std::list<A> seq_in_physical_order { { "abc", 23.67 }, { "def", 11.05 }, { "ghi", 17.32 },
{ "jkl", 56.78 }, { "mno", 33.12 }, { "pqr", 40.71 } } ;
std::vector< std::reference_wrapper< const A > > seq_in_logical_order( seq_in_physical_order.begin(),
seq_in_physical_order.end() ) ;
// perform a logical ordering with respect to the member 'number'
std::sort( seq_in_logical_order.begin(), seq_in_logical_order.end(),
[] ( const A& first, const A& second ) { return first.number < second.number ; } ) ;
std::cout << "in physical order:\n-----------------\n" ;
for( const A& a : seq_in_physical_order ) std::cout << a << " @ " << std::addressof(a) << '\n' ;
std::cout << "\n\n\nin logical order:\n----------------\n" ;
for( const A& a : seq_in_logical_order ) std::cout << a << " @ " << std::addressof(a) << '\n' ;
std::cout << '\n' ;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDx2ZWN0b3I+CgpzdHJ1Y3QgQQp7CiAgICBzdGQ6OnN0cmluZyBzdHIgOwogICAgZG91YmxlIG51bWJlciA7CgogICAgLy8gLi4uCn07CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBzdG0sIGNvbnN0IEEmIGEgKQp7IHJldHVybiBzdG0gPDwgInsnIiA8PCBhLnN0ciA8PCAiJywiIDw8IGEubnVtYmVyIDw8ICd9JyA7IH0KCmludCBtYWluKCkKewogICAgLy8gY29uc3QsIGltbXV0YWJsZSwKICAgIGNvbnN0IHN0ZDo6bGlzdDxBPiBzZXFfaW5fcGh5c2ljYWxfb3JkZXIgeyB7ICJhYmMiLCAyMy42NyB9LCB7ICJkZWYiLCAxMS4wNSB9LCB7ICJnaGkiLCAxNy4zMiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgImprbCIsIDU2Ljc4IH0sIHsgIm1ubyIsIDMzLjEyIH0sIHsgInBxciIsIDQwLjcxIH0gfSA7CgogICAgc3RkOjp2ZWN0b3I8IHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8IGNvbnN0IEEgPiA+IHNlcV9pbl9sb2dpY2FsX29yZGVyKCBzZXFfaW5fcGh5c2ljYWxfb3JkZXIuYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcV9pbl9waHlzaWNhbF9vcmRlci5lbmQoKSApIDsKICAgIC8vIHBlcmZvcm0gYSBsb2dpY2FsIG9yZGVyaW5nIHdpdGggcmVzcGVjdCB0byB0aGUgbWVtYmVyICdudW1iZXInCiAgICBzdGQ6OnNvcnQoIHNlcV9pbl9sb2dpY2FsX29yZGVyLmJlZ2luKCksIHNlcV9pbl9sb2dpY2FsX29yZGVyLmVuZCgpLAogICAgICAgICAgICAgICBbXSAoIGNvbnN0IEEmIGZpcnN0LCBjb25zdCBBJiBzZWNvbmQgKSB7IHJldHVybiBmaXJzdC5udW1iZXIgPCBzZWNvbmQubnVtYmVyIDsgfSAgKSA7CgogICAgc3RkOjpjb3V0IDw8ICJpbiBwaHlzaWNhbCBvcmRlcjpcbi0tLS0tLS0tLS0tLS0tLS0tXG4iIDsKICAgIGZvciggY29uc3QgQSYgYSA6IHNlcV9pbl9waHlzaWNhbF9vcmRlciApIHN0ZDo6Y291dCA8PCBhIDw8ICIgQCAiIDw8IHN0ZDo6YWRkcmVzc29mKGEpIDw8ICdcbicgOwoKICAgIHN0ZDo6Y291dCA8PCAiXG5cblxuaW4gbG9naWNhbCBvcmRlcjpcbi0tLS0tLS0tLS0tLS0tLS1cbiIgOwogICAgZm9yKCBjb25zdCBBJiBhIDogc2VxX2luX2xvZ2ljYWxfb3JkZXIgKSBzdGQ6OmNvdXQgPDwgYSA8PCAiIEAgIiA8PCBzdGQ6OmFkZHJlc3NvZihhKSA8PCAnXG4nIDsKICAgIHN0ZDo6Y291dCA8PCAnXG4nIDsKCn0K
in physical order:
-----------------
{'abc',23.67} @ 0x92d70a0
{'def',11.05} @ 0x92d70b8
{'ghi',17.32} @ 0x92d70d0
{'jkl',56.78} @ 0x92d70e8
{'mno',33.12} @ 0x92d7100
{'pqr',40.71} @ 0x92d7118
in logical order:
----------------
{'def',11.05} @ 0x92d70b8
{'ghi',17.32} @ 0x92d70d0
{'abc',23.67} @ 0x92d70a0
{'mno',33.12} @ 0x92d7100
{'pqr',40.71} @ 0x92d7118
{'jkl',56.78} @ 0x92d70e8