fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. template <typename FI ,class L >
  6. std::vector<int> sorta(FI begin, FI end, L comp_proc){
  7. size_t size = std::distance(begin, end);
  8. using T = typename std::iterator_traits<FI>::value_type;
  9.  
  10. std::vector <int> indexs(size);
  11. for (size_t i = 0; i < indexs.size(); i++)
  12. indexs[i] = i;
  13.  
  14. std::sort(begin, end, [&comp_proc,&begin,&indexs](const T& l_item,const T& r_item){
  15.  
  16. size_t l_dis = std::distance(&(*begin),const_cast<T*>(&l_item));//not working correctly
  17. size_t r_dis = std::distance(&(*begin),const_cast<T*>(&r_item));//not working correctly
  18. std::cout << l_item<<"**"<<&l_item <<"**"<<l_dis << "**" << r_dis << std::endl;
  19.  
  20. bool res = comp_proc(l_item, r_item);
  21. if (const_cast<T*>(&l_item) > &(*begin) && const_cast<T*>(&r_item) > &(*begin)){
  22. if (res){
  23. std::swap(indexs[l_dis], indexs[r_dis]);//not working
  24. }
  25. }
  26.  
  27. return res;
  28. });
  29. return indexs;
  30.  
  31. }
  32.  
  33. int main()
  34. {
  35. std::vector<int> a{1,5,3,4,7};
  36. std::vector<int> indexes=sorta(a.begin(),a.end(),[](const int& a,const int& b){return a<b;});
  37.  
  38. std::cout<<"\n";
  39. for(auto i:indexes)
  40. {
  41. std::cout<<i<<"\n";
  42. }
  43. }
  44.  
Success #stdin #stdout 0s 3480KB
stdin
Standard input is empty
stdout
5**0x911400c**1**0
5**0xbfcbd02c**3987645449**0
3**0x9114010**2**0
3**0xbfcbd02c**3987645449**1
3**0xbfcbd02c**3987645449**0
4**0x9114014**3**0
4**0xbfcbd02c**3987645449**2
4**0xbfcbd02c**3987645449**1
7**0x9114018**4**0
7**0xbfcbd02c**3987645449**3

0
0
0
3
4