我有一个包含多个double
类型成员的类。
假设我需要创建一个函数,根据类中其中一个成员的值对类对象的 vector 进行重新排序。所以:
class myClass{
...
public:
double x, y, z;
...
}
void SpecialSort_x(std::vector<myClass>& vec) {
// re-order stuff according to values of vec[i].x
...
}
但现在,我希望能够进行相同的重新排序,但要根据类中其他成员的值(y
和 z
上面的代码)。
除了将所有对 x
的引用更改为 y
或 z
之外,没有再创建两个与第一个相同的函数,我想制作一个单一的多态函数,它可以根据 myClass
的任何成员重新排序 vector 。
执行此操作的最佳方法是什么?
最佳答案
您可以使用 std::sort
,结合 lambda 和指向成员的指针:
#include <vector>
#include <algorithm>
class MyClass
{
public:
double x, y, z;
};
typedef double MyClass::* Field;
void specialSort(std::vector<MyClass>& vec, Field field)
{
std::sort(vec.begin(), vec.end(), [field](const MyClass & a, const MyClass & b) -> bool
{
return a.*field < b.*field;
});
}
int main()
{
std::vector<MyClass> vec;
Field member = &MyClass::x;
specialSort(vec, member);
return 0;
}
您还可以使用以下方式对排序进行模板化:
template<class T>
void specialSort(std::vector<T>& vec, double T::* field)
{
std::sort(vec.begin(), vec.end(), [field](const T& a, const T& b) -> bool
{
return a.*field < b.*field;
});
}
关于c++ - 对不同的类成员进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296444/