对不同的类成员进行排序
Sort Over Different Class Members
我有一个类,其中包括几个类型为double
的成员。
假设我需要创建一个函数,该函数根据类中的一个成员的值对类对象的向量重新排序。所以:
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
的任何成员对向量重新排序。
最好的方法是什么?
您可以将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;
});
}
鉴于这里的问题描述,我同意每个人提出的替代方法。
但是,如果确实需要访问在运行时选择的类成员,可以使用指向成员的指针类型。然而,通常有一种更优雅的方法来实现你想要的效果。
例如:#include <iostream>
#include <vector>
struct X {
double a;
double b;
double c;
};
void operate_on_member(const X& x, double X::*pm)
{
std::cout << x.*pm << 'n';
}
int main()
{
std::vector<X> xs {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
for (const auto& x : xs)
operate_on_member(x, &X::a);
for (const auto& x : xs)
operate_on_member(x, &X::b);
for (const auto& x : xs)
operate_on_member(x, &X::c);
}
相关文章:
- 类成员重新排序
- 如何在 c++11 中静态断言 std::array 类成员进行排序?
- 按类成员的顺序对包含类对象的C++向量进行排序
- 只对向量中的一个类成员进行排序,其他成员保持不变
- 合并 2 个排序的链表。必需的成员函数 bool Merge(List342 &list1):
- 对结构int成员进行排序
- C++排序向量<double>与在<Object>双成员变量上键控的向量
- 如何对类成员向量进行排序
- 如何对同一数组索引下的结构成员进行排序?
- 对多个数据成员进行排序
- 根据类成员对同一密钥的多映射元素进行排序
- 在对结构数组的一个成员进行排序后,移动其成员的其余部分
- std::具有自定义比较函数结果的排序函数错误:必须调用对非静态成员函数的引用
- 排序链表-移动节点还是交换数据成员
- 如何为涉及对象成员、间接寻址和强制转换的排序算法实现lambda函数
- 使用 #include 按<algorithm>字符串数据成员对类对象的向量进行排序
- 通过私人成员对自定义对象进行排序
- 如何根据其中一个成员的值对结构数组进行排序,从而在另一个成员的基础上断开联系
- 重新排序成员声明
- 使用sort()排序成员向量的比较函数