c++ - 对不同的类成员进行排序

标签 c++

我有一个包含多个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
    ...
}

但现在,我希望能够进行相同的重新排序,但要根据类中其他成员的值(yz上面的代码)。

除了将所有对 x 的引用更改为 yz 之外,没有再创建两个与第一个相同的函数,我想制作一个单一的多态函数,它可以根据 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/

相关文章:

c++ - 如何将十进制整数转换为十六进制整数?

c++ - std::array<char, N> 到 std::string

c++ - 无论区域设置如何,如何将 float 转换为字符串?

c++ - MxCalloc 和 MxFree 与 OpenMP 结果双重释放或损坏

c++ - 重载 cin >> 运算符跳过一行输入

c++ - pcap 函数出现未解析的外部符号 (LNK 2001) 错误

c++ - 剥离使可执行文件膨胀的未使用的运行时函数 (GCC)

c++ - 将类对象放在 vector 中?

c++ - Cppcheck无法识别命令

c++ - 调用默认构造函数没有匹配的函数