枚举类的static_cast的时间复杂度

时间:2019-10-05 11:38:24

标签: c++ enums

假设我在C ++中具有以下内容

enum class my_enum {
    item1, item2, ..., itemn, last_
};

我希望能够轻松地在my_enumint之间进行转换 (用于映射/定位),例如static_cast<size_t>(enum_object)。现在,用n表示的时间复杂度是多少 这个手术?是O(n)还是O(1)? 甚至更奇怪的建议是,到O(log(n)) 是否存储map<my_enum,size_t>之类的内容?

2 个答案:

答案 0 :(得分:2)

简短答案: O(1)用于转换,0(log(n))用于插入地图,0(1)用于插入unordered_map

长答案:

枚举被映射为int,因此该枚举实际上是一个 inside 内在的内存

假设您拥有:

enum MyEnum{enum1, enum2};

static_cast在编译时完成,因此以下操作与复杂性完全一样

    int a=static_cast<int>(MyEnum::enum1);

关于插入,映射,请参阅STL,详细介绍了所有复杂性

答案 1 :(得分:1)

enum值转换为整数的时间复杂度为O(1)

枚举在运行时只不过是一个数字,因此很可能根本不需要执行任何代码即可进行转换。如果枚举的基础类型(默认为int)和转换目标类型具有不同的字节表示形式,则可能会执行某些代码

换句话说,这两次转换导致相同的汇编代码:

MyEnum enumVal = ...;
T integer = static_cast<T>(enumVal);

std::underlying_type_t<MyEnum> underlying = ...;
T integer = static_cast<T>(underlying);

关于std::map,复杂度取决于操作;有关详细信息,请参见here。插入为O(log(n)),其中n是映射大小(元素数)。

枚举数永远不会影响时间的复杂性-在C ++中,甚至没有简单的方法来计算没有额外的“计数”枚举数或宏的枚举数。