#include <vector>
#include <string>
#include <numeric>
#include <algorithm>
#include <iostream>
#include <iomanip>
template < typename T, typename U, typename V>
void print_parallel( const T& a, const U& b, const V& idx)
{
for ( unsigned i = 0 ; i < a.size ( ) ; ++ i)
{
std:: cout << std:: left << std:: setw ( 10 ) << a[ idx[ i] ] ;
std:: cout << std:: right << std:: setw ( 10 ) << b[ idx[ i] ] << '\n ' ;
}
}
int main( )
{
std:: vector < std:: string > aminals = { "dog" , "cat" , "giraffe" , "rabbit" , "snake" } ;
std:: vector < double > values = { 2.3 , 19.0 , 5.67 , 4 , 1.004 } ;
auto by_aminal = [ & ] ( unsigned i, unsigned j) { return aminals[ i] < aminals[ j] ; } ;
auto by_value = [ & ] ( unsigned i, unsigned j) { return values[ i] < values[ j] ; } ;
std:: vector < unsigned > indices( aminals.size ( ) ) ;
std:: iota ( indices.begin ( ) , indices.end ( ) , 0 ) ;
std:: cout << "Before sort by value:\n " ;
print_parallel( aminals, values, indices) ;
std:: sort ( indices.begin ( ) , indices.end ( ) , by_value) ;
std:: cout << "\n After sort by value:\n " ;
print_parallel( aminals, values, indices) ;
std:: sort ( indices.begin ( ) , indices.end ( ) , by_aminal) ;
std:: cout << "\n After sort by aminal:\n " ;
print_parallel( aminals, values, indices) ;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgVj4Kdm9pZCBwcmludF9wYXJhbGxlbChjb25zdCBUJiBhLCBjb25zdCBVJiBiLCBjb25zdCBWJiBpZHgpCnsKICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhLnNpemUoKTsgKytpKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmxlZnQgPDwgc3RkOjpzZXR3KDEwKSA8PCBhW2lkeFtpXV07CiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6cmlnaHQgPDwgc3RkOjpzZXR3KDEwKSA8PCBiW2lkeFtpXV0gPDwgJ1xuJzsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gIGFtaW5hbHMgPSB7ICJkb2ciLCAiY2F0IiwgImdpcmFmZmUiLCAicmFiYml0IiwgInNuYWtlIiB9OwogICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB2YWx1ZXMgPSB7IDIuMywgMTkuMCwgNS42NywgNCwgMS4wMDQgfTsKCiAgICBhdXRvIGJ5X2FtaW5hbCA9IFsmXSh1bnNpZ25lZCBpLCB1bnNpZ25lZCBqKSB7IHJldHVybiBhbWluYWxzW2ldIDwgYW1pbmFsc1tqXTsgfTsKICAgIGF1dG8gYnlfdmFsdWUgPSBbJl0odW5zaWduZWQgaSwgdW5zaWduZWQgaikgeyByZXR1cm4gdmFsdWVzW2ldIDwgdmFsdWVzW2pdOyB9OwoKICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBpbmRpY2VzKGFtaW5hbHMuc2l6ZSgpKTsKICAgIHN0ZDo6aW90YShpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksIDApOwoKICAgIHN0ZDo6Y291dCA8PCAiQmVmb3JlIHNvcnQgYnkgdmFsdWU6XG4iOwogICAgcHJpbnRfcGFyYWxsZWwoYW1pbmFscywgdmFsdWVzLCBpbmRpY2VzKTsKCiAgICBzdGQ6OnNvcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLCBieV92YWx1ZSk7CgogICAgc3RkOjpjb3V0IDw8ICJcbkFmdGVyIHNvcnQgYnkgdmFsdWU6XG4iOwogICAgcHJpbnRfcGFyYWxsZWwoYW1pbmFscywgdmFsdWVzLCBpbmRpY2VzKTsKCiAgICBzdGQ6OnNvcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLCBieV9hbWluYWwpOwoKICAgIHN0ZDo6Y291dCA8PCAiXG5BZnRlciBzb3J0IGJ5IGFtaW5hbDpcbiI7CiAgICBwcmludF9wYXJhbGxlbChhbWluYWxzLCB2YWx1ZXMsIGluZGljZXMpOwp9Cg==