2013-10-03 44 views
1

排序对象的矢量我这是基于关闭的一些这方面的工作代码: Sorting a vector of objects by a property of the objectC++模板的属性

我重新措辞,拿出了大量的非必要的东西,使其更容易让我明白。我仍然无法确切知道代码在做什么,有人可以评论这段代码或者逐步解释这段代码吗?我对模板的主要内容大多感到困惑。

#import <iostream> 
#include <algorithm> 
#include <vector> 
#include <string> 
#include <functional> 

using namespace std; 


//Can someone please explain this template stuff??? 
template < typename TYPE, typename MTYPE> 
struct member_comparer { 

    MTYPE TYPE::*val; 

    explicit member_comparer(MTYPE TYPE::*p) { 
     val = p; 
    } 

    bool operator()(TYPE lhs, TYPE rhs) { 
     return lhs.*val < rhs.*val; 
    } 
}; 



template<typename TYPE, typename MTYPE> 
member_comparer<TYPE, MTYPE> make_member_comparer(MTYPE TYPE::*p) { 
    return member_comparer<TYPE, MTYPE>(p); 
} 

//PLEASE EXPLAIN THE STUFF ABOVE HERE^





struct Number 
{ 
    //declare our strings 
    int i; 
    string s; 

    //preset the values in the constructor! 
    Number(int i, string s) { 
     this->i = i; 
     this->s = s; 
    } 
}; 



int main() 
{ 

    //declare a new vector of Numbers 
    vector<Number> vec; 

    //fill in the vector 
    vec.push_back(Number(2, "two")); 
    vec.push_back(Number(8, "eight")); 


    // sort by i, ascending 
    sort(vec.begin(), vec.end(), make_member_comparer(&Number::i)); 
    cout << vec.front().i << ", " << vec.back().i << "\n"; 
    //outputs 2, 8 


    // sort by s, ascending 
    sort(vec.begin(), vec.end(), make_member_comparer(&Number::s)); 
    cout << vec.front().s << ", " << vec.back().s << "\n"; 
    //outputs eight, two 
} 

回答

1
template < typename TYPE, typename MTYPE> 
struct member_comparer { 

MTYPE TYPE::*val;  // public field, a pointer to MTYPE 

explicit member_comparer(MTYPE TYPE::*p) { // explicit constructor 
    val = p; 
} 

bool operator()(TYPE lhs, TYPE rhs) { // operator() (TYPE lhs, TYPE rhs) 
              // this is typical for a functor 
    return lhs.*val < rhs.*val; 
} 
}; 


template<typename TYPE, typename MTYPE> 
member_comparer<TYPE, MTYPE> make_member_comparer(MTYPE TYPE::*p) { 
    return member_comparer<TYPE, MTYPE>(p);  // return an instance of the functor 
} 
1

MTYPE TYPE::*val;是上部件的指针从TYPE类。该会员的类型为MTYPE

template <typename TYPE, typename MTYPE> struct它是一个由两个类型参数化的结构。 TYPE这应该是类,MTYPE这应该是成员的类型。

template<typename TYPE, typename MTYPE> 
member_comparer<TYPE, MTYPE> make_member_comparer(MTYPE TYPE::*p) { 
    return member_comparer<TYPE, MTYPE>(p); 
} 

make_member_comparer是一个辅助功能,避免使用:

member_comparer<Number, int>(&Number::i)