我有一个包含成员 x、y、z 和 w 的结构。如何高效排序 在 C++ 中先按 x,然后按 y,按 z,最后按 w?
最佳答案
如果你想实现字典排序,那么最简单的方法就是使用std::tie
。实现小于或大于比较运算符或仿函数,然后使用 std::sort
在你的结构集合上。
struct Foo
{
T x, y, z, w;
};
....
#include <tuple> // for std::tie
bool operator<(const Foo& lhs, const Foo& rhs)
{
// assumes there is a bool operator< for T
return std::tie(lhs.x, lhs.y, lhs.z, lhs.w) < std::tie(rhs.x, rhs.y, rhs.z, rhs.w);
}
....
#include <algorithm> // for std::sort
std::vector<Foo> v = ....;
std::sort(v.begin(), v.end());
如果 Foo
没有自然顺序, 最好定义比较仿函数而不是实现比较运算符。然后您可以将这些传递给排序:
bool cmp_1(const Foo& lhs, const Foo& rhs)
{
return std::tie(lhs.x, lhs.y, lhs.z, lhs.w) < std::tie(rhs.x, rhs.y, rhs.z, rhs.w);
}
std::sort(v.begin(), v.end(), cmp_1);
如果您没有 C++11 tuple
支持,您可以使用 std::tr1::tie
来实现它(使用标题 <tr1/tuple>
)或使用 boost::tie
来自 boost.tuple library .
关于c++ - 如何在 C++ 中有效地对四重结构进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17080729/