Is there support in C++/STL for sorting objects by attribute?

后端 未结 8 1176
耶瑟儿~
耶瑟儿~ 2020-11-30 05:16

I wonder if there is support in STL for this:

Say I have an class like this :

class Person
{
public:
  int getAge() const;
  double getIncome() const         


        
8条回答
  •  离开以前
    2020-11-30 05:19

    Generic adaptor to compare based on member attributes. While it is quite more verbose the first time it is reusable.

    // Generic member less than
    template 
    struct member_lt_type 
    {
       typedef M T::* member_ptr;
       member_lt_type( member_ptr p, C c ) : ptr(p), cmp(c) {}
       bool operator()( T const & lhs, T const & rhs ) const 
       {
          return cmp( lhs.*ptr, rhs.*ptr );
       }
       member_ptr ptr;
       C cmp;
    };
    
    // dereference adaptor
    template 
    struct dereferrer
    {
       dereferrer( C cmp ) : cmp(cmp) {}
       bool operator()( T * lhs, T * rhs ) const {
          return cmp( *lhs, *rhs );
       }
       C cmp;
    };
    
    // syntactic sugar
    template 
    member_lt_type > member_lt( M T::*ptr ) {
       return member_lt_type >(ptr, std::less() );
    }
    
    template 
    member_lt_type member_lt( M T::*ptr, C cmp ) {
       return member_lt_type( ptr, cmp );
    }
    
    template 
    dereferrer deref( C cmp ) {
       return dereferrer( cmp );
    }
    
    // usage:    
    struct test { int x; }
    int main() {
       std::vector v;
       std::sort( v.begin(), v.end(), member_lt( &test::x ) );
       std::sort( v.begin(), v.end(), member_lt( &test::x, std::greater() ) );
    
       std::vector vp;
       std::sort( v.begin(), v.end(), deref( member_lt( &test::x ) ) );
    }
    

提交回复
热议问题