#include <iostream>
#include <algorithm>
#include <vector>
template <typename FI ,class L >
std::vector<int> sorta(FI begin, FI end, L comp_proc){
size_t size = std::distance(begin, end);
using T = typename std::iterator_traits<FI>::value_type;
std::vector <int> indexs(size);
for (size_t i = 0; i < indexs.size(); i++)
indexs[i] = i;
std::sort(begin, end, [&comp_proc,&begin,&indexs](const T& l_item,const T& r_item){
size_t l_dis = std::distance(&(*begin),const_cast<T*>(&l_item));//not working correctly
size_t r_dis = std::distance(&(*begin),const_cast<T*>(&r_item));//not working correctly
std::cout << l_item<<"**"<<&l_item <<"**"<<l_dis << "**" << r_dis << std::endl;
bool res = comp_proc(l_item, r_item);
if (const_cast<T*>(&l_item) > &(*begin) && const_cast<T*>(&r_item) > &(*begin)){
if (res){
std::swap(indexs[l_dis], indexs[r_dis]);//not working
}
}
return res;
});
return indexs;
}
int main()
{
std::vector<int> a{1,5,3,4,7};
std::vector<int> indexes=sorta(a.begin(),a.end(),[](const int& a,const int& b){return a<b;});
std::cout<<"\n";
for(auto i:indexes)
{
std::cout<<i<<"\n";
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEZJICxjbGFzcyBMID4Kc3RkOjp2ZWN0b3I8aW50PiBzb3J0YShGSSBiZWdpbiwgRkkgZW5kLCBMIGNvbXBfcHJvYyl7CiAgICBzaXplX3Qgc2l6ZSA9IHN0ZDo6ZGlzdGFuY2UoYmVnaW4sIGVuZCk7CiAgICB1c2luZyBUID0gdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8Rkk+Ojp2YWx1ZV90eXBlOwoKICAgIHN0ZDo6dmVjdG9yIDxpbnQ+IGluZGV4cyhzaXplKTsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5kZXhzLnNpemUoKTsgaSsrKQogICAgICAgIGluZGV4c1tpXSA9IGk7CgogICAgc3RkOjpzb3J0KGJlZ2luLCBlbmQsIFsmY29tcF9wcm9jLCZiZWdpbiwmaW5kZXhzXShjb25zdCBUJiBsX2l0ZW0sY29uc3QgVCYgcl9pdGVtKXsKCiAgICAgICAgc2l6ZV90IGxfZGlzID0gc3RkOjpkaXN0YW5jZSgmKCpiZWdpbiksY29uc3RfY2FzdDxUKj4oJmxfaXRlbSkpOy8vbm90IHdvcmtpbmcgY29ycmVjdGx5CiAgICAgICAgc2l6ZV90IHJfZGlzID0gc3RkOjpkaXN0YW5jZSgmKCpiZWdpbiksY29uc3RfY2FzdDxUKj4oJnJfaXRlbSkpOy8vbm90IHdvcmtpbmcgY29ycmVjdGx5CiAgICAgICAgc3RkOjpjb3V0IDw8IGxfaXRlbTw8IioqIjw8JmxfaXRlbSA8PCIqKiI8PGxfZGlzIDw8ICIqKiIgPDwgcl9kaXMgPDwgc3RkOjplbmRsOwoKICAgICAgICBib29sIHJlcyA9IGNvbXBfcHJvYyhsX2l0ZW0sIHJfaXRlbSk7CiAgICAgICAgaWYgKGNvbnN0X2Nhc3Q8VCo+KCZsX2l0ZW0pID4gJigqYmVnaW4pICYmIGNvbnN0X2Nhc3Q8VCo+KCZyX2l0ZW0pID4gJigqYmVnaW4pKXsKICAgICAgICAgICAgaWYgKHJlcyl7CiAgICAgICAgICAgICAgICBzdGQ6OnN3YXAoaW5kZXhzW2xfZGlzXSwgaW5kZXhzW3JfZGlzXSk7Ly9ub3Qgd29ya2luZwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzOwogICAgfSk7CiAgICByZXR1cm4gaW5kZXhzOwoKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IGF7MSw1LDMsNCw3fTsKICAgIHN0ZDo6dmVjdG9yPGludD4gaW5kZXhlcz1zb3J0YShhLmJlZ2luKCksYS5lbmQoKSxbXShjb25zdCBpbnQmIGEsY29uc3QgaW50JiBiKXtyZXR1cm4gYTxiO30pOwoKICAgIHN0ZDo6Y291dDw8IlxuIjsKICAgIGZvcihhdXRvIGk6aW5kZXhlcykKICAgIHsKICAgICAgICBzdGQ6OmNvdXQ8PGk8PCJcbiI7CiAgICB9Cn0K