使用枚举迭代

时间:2016-02-08 12:44:25

标签: c++ c++11 enums

我有std::map,其关键是这样的枚举:

enum class my_enum{a=1,b,c,d};
std::map<my_enum,my_class> my_map;

我想迭代地图,所以我使用了这个for

for (auto current_type = (id_type)0;
     (int)current_type < 4;
     current_type = (my_enum)((int)current_type + 1)){
   //do things
}

我认为这是垃圾。你有更好的建议吗?

修改

我完全知道使用迭代器。我知道他们是优先考虑的。但是,出于某种原因,我必须坚持使用常规的基于索引的for

2 个答案:

答案 0 :(得分:3)

迭代地图m

for( auto& item : m ) ...

迭代enum class值:

#include <initializer_list>

enum class my_enum{a=1,b,c,d};

auto main() -> int
{
    using E = my_enum;
    for( my_enum const id : {E::a, E::b, E::c, E::d} ) {}
}

enum class my_enum{a=1,b,c,d};

auto main() -> int
{
    for( int i = int( my_enum::a ); i <= int( my_enum::d ); ++i )
    {
        auto const id = my_enum( i );
        // ...
    }
}

答案 1 :(得分:1)

定义您的类型:

enum class my_enum{a=1, b, c, d, END};
std::map<my_enum,my_class> my_map;

my_enum& operator++( my_enum &val ) {
  using IntType = typename std::underlying_type<my_enum>::type
  val = static_cast<my_enum>( static_cast<IntType>(val) + 1 );
  return val;
}

然后你可以像这样使用它们:

for (my_enum e = my_enum::a; e < my_enum::END; ++e) {
   my_class c = my_map[e];
   ....
}

(尽管如果您不想为不存在的条目创建空值,您可能更喜欢使用其他运算符[]。)