用一个函数对象实现不同元素类型的排序解决方法
用一个函数对象实现不同元素类型的排序
假如有两个结构体:
struct stru1
{
int a;
string b;
};
struct stru2
{
int c;
string d;
};
分别用一个vector存储stru1、stru2类型的元素:
vector<stru1> v1;
vector<stru2> v2;
通过带有函数对象参数的sort()可以对vector进行排序。
请问,可以定义一种函数对象,能同时支持对v1和v2的排序吗?重载operator()除外。
------解决方案--------------------
看了很久终于看明白什么意思了。
template<class T, class ValueType>
struct Cmp
{
ValueType T::*member_;
Cmp(ValueType T::*m):member_(m){}
bool operator () (T const& t1, T const& t2)
{
return (t1.*member_) < (t2.*member_);
}
};
std::sort(vec1.begin(), vec1.end(), Cmp<stru1, int>(&stru1::a) );
std::sort(vec2.begin(), vec2.end(), Cmp<stru2, std::string >(&stru2::d) );
假如有两个结构体:
struct stru1
{
int a;
string b;
};
struct stru2
{
int c;
string d;
};
分别用一个vector存储stru1、stru2类型的元素:
vector<stru1> v1;
vector<stru2> v2;
通过带有函数对象参数的sort()可以对vector进行排序。
请问,可以定义一种函数对象,能同时支持对v1和v2的排序吗?重载operator()除外。
------解决方案--------------------
看了很久终于看明白什么意思了。
template<class T, class ValueType>
struct Cmp
{
ValueType T::*member_;
Cmp(ValueType T::*m):member_(m){}
bool operator () (T const& t1, T const& t2)
{
return (t1.*member_) < (t2.*member_);
}
};
std::sort(vec1.begin(), vec1.end(), Cmp<stru1, int>(&stru1::a) );
std::sort(vec2.begin(), vec2.end(), Cmp<stru2, std::string >(&stru2::d) );