按其值排序枚举向量

时间:2017-05-17 10:20:04

标签: c++ sorting enums

我有一个包含4个不同值的枚举类。 ABCD

我无法控制基础类型是什么。

我有一个枚举向量,我想订购它,所以A都是第一个。然后是所有B,然后是所有C,最后是所有D

我可以用很长的if语句来做。但我想知道是否有一种简单的惯用方法来实现这一点。

编辑:你误解了我想要的东西。我有一个像这样的枚举类:

enum class MyEnum { A = 3, B = 1, C = 4, D = 2};

我有一个这个枚举的向量,我想订购,以便A在D之前的C之前的B之前。

std::sort在这里没有任何帮助。

2 个答案:

答案 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);
}