【问题标题】:C++ Template to Sort Vector of Objects by Attribute按属性对对象向量进行排序的 C++ 模板
【发布时间】:2013-10-10 12:43:13
【问题描述】:

我有一些基于此的工作代码: Sorting a vector of objects by a property of the object

我重新措辞并删除了很多不必要的东西,以便我更容易理解。我仍然无法确切地知道代码在做什么,有人可以评论这段代码或逐步引导我解释这里发生了什么吗?我对模板的主要内容感到困惑。

#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
}

【问题讨论】:

    标签: c++ templates sorting c++11 vector


    【解决方案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 
    }
    

    【讨论】:

      【解决方案2】:

      MTYPE TYPE::*val;TYPE 类成员的指针。该成员的类型为MTYPE

      template &lt;typename TYPE, typename MTYPE&gt; 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&lt;Number, int&gt;(&amp;Number::i)

      【讨论】:

        猜你喜欢
        • 2011-07-07
        • 2011-03-25
        • 1970-01-01
        • 1970-01-01
        • 2017-09-14
        • 2016-02-08
        • 2011-03-21
        • 2013-02-12
        • 2023-04-03
        相关资源
        最近更新 更多