我有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
。
答案 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];
....
}
(尽管如果您不想为不存在的条目创建空值,您可能更喜欢使用其他运算符[]。)