LINUX.ORG.RU

Generic comparator with templated accessor to elements

 ,


0

1

Провет, я хотел бы наити стандартный способ (СТЛ) сортировки массива пар, с возвожностью специализации способа сравнениа елементов

Что то вроде вот такого

template <class P>
struct Pair2First {
    const typename P::first_type& operator() (const P &p) { return p.first; }
};

template <class P>
struct Pair2Second {
    const typename P::second_type& operator() (const P &p) { return p.second; }
};

template <class Type, typename Accessor>
struct Greater {
    typedef Type first_argument_type;
    typedef Type second_argument_type;
    typedef bool result_type;
    
    bool operator() (const Type& lhs, const Type& rhs) const {
        return accessor(lhs) > accessor(rhs);
    }
    
    Accessor accessor;
};

typedef pair<int, double> PairX;

int main()
{
    vector<PairX> vec = {
        make_pair(9, 6.5),
        make_pair(3, 6.3),
        make_pair(5, 6.9),
    };
    
    PairX p1 = make_pair(1, 2.0);
    PairX p2 = make_pair(2, 1.0);
    
    cout << Greater<PairX, Pair2First<PairX>>()(p1, p2) << endl;
    
    stable_sort(vec.begin(), vec.end(), Pair2First<PairX>>);
}

зачем, когда есть лямбды?

C++11, например

  stable_sort(v.begin(), v.end(), 
      [](decltype(*v.cbegin()) left, decltype(*v.cbegin()) right)
      {   
          return left.first < right.second;
      }   
  );  

а в C++14 уже есть generic-лямбды

peacelove
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.