joh*_*ers 1 c++ sorting containers struct tuples
我有一个POD,有大约30个不同类型的成员,我想要将数千个POD存储在一个容器中,然后由其中一个成员对该容器进行排序.
例如:
struct Person{
int idNumber;
....many other members
}
Run Code Online (Sandbox Code Playgroud)
Person我想要排序的数千个对象idNumber或我选择排序的任何其他成员.
我今天一直在研究这个问题,似乎最有效,或者至少是最简单的解决方案根本就没有用struct,而是使用tuple我可以将索引号传递给自定义比较函数来使用在std::sort.(此页面上的一个示例显示了一种轻松实现此类排序的方法,但是对于单个成员而言struct,这样做会使得模板化不那么容易,因为您必须按名称引用成员,而不是通过索引引用tuple提供.)
关于这种方法我的两部分问题是:1)元组是否可以接受相当大,有几十个成员?2)是否有一个同样优雅的解决方案继续使用struct而不是tuple为此?
您可以创建一个比较器,用于存储指向成员的指针,以便它知道要将哪个成员用于比较:
struct POD {
int i;
char c;
float f;
long l;
double d;
short s;
};
template<typename C, typename T>
struct Comp {
explicit Comp(T C::* p) : ptr(p) {}
bool operator()(const POD& p1, const POD& p2) const
{
return p1.*ptr < p2.*ptr;
}
private:
T C::* ptr;
};
// helper function to make a comparator easily
template<typename C, typename T>
Comp<C,T> make_comp( T C::* p)
{
return Comp<C,T>(p);
}
int main()
{
std::vector<POD> v;
std::sort(v.begin(), v.end(), make_comp(&POD::i));
std::sort(v.begin(), v.end(), make_comp(&POD::d));
// etc...
}
Run Code Online (Sandbox Code Playgroud)
为了进一步概括这一点,make_comp请使用自定义比较器,这样您就可以进行大于和等比较.