我有一个包含4个不同值的枚举类。 A
,B
,C
和D
。
我无法控制基础类型是什么。
我有一个枚举向量,我想订购它,所以A
都是第一个。然后是所有B
,然后是所有C
,最后是所有D
。
我可以用很长的if语句来做。但我想知道是否有一种简单的惯用方法来实现这一点。
编辑:你误解了我想要的东西。我有一个像这样的枚举类:
enum class MyEnum { A = 3, B = 1, C = 4, D = 2};
我有一个这个枚举的向量,我想订购,以便A在D之前的C之前的B之前。
std::sort
在这里没有任何帮助。
答案 0 :(得分:0)
C ++无法根据名称对值进行排序,只能基于值,因此您必须提供所需顺序的映射。使用表格或排名函数,如:
enum class MyEnum { A = 3, B = 1, C = 4, D = 2};
int rank(MyEnum value)
{
switch (value)
{
case MyEnum::A:
return 1;
case MyEnum::B:
return 2;
case MyEnum::C:
return 3;
case MyEnum::D:
return 4;
}
}
bool operator<(MyEnum left, MyEnum right)
{ return rank(left) < rank(right); }
现在std::sort(v.begin(), v.end())
应该适用于MyEnum
s。
您可以将operator<
转换为仿函数并将其传递给sort
,如果您不希望枚举与排序方式进行比较。
答案 1 :(得分:0)
一种避免运行方式“切换”或表驱动比较的运行时效率更高的方法是:
inline bool operator<(MyEnum left, MyEnum right) {
return static_cast<std::underlying_type_t<MyEnum>>(left) < static_cast<std::underlying_type_t<MyEnum>>(right);
}
用于需要枚举通过std :: less进行排序或排序(例如std :: sort)的上下文中。
如果您愿意,可以对这种比较进行模板化,以使其影响每个枚举(或可能每个具有某些识别功能的枚举,以减少混乱)。 “每个枚举”方法可能看起来像这样:
template <typename T, typename N=std::enable_if_t<std::is_enum_v<T>>>
inline bool operator<(T left, T right) {
return static_cast<std::underlying_type_t<T>>(left) < static_cast<std::underlying_type_t<T>>(right);
}