假设我在C ++中具有以下内容
enum class my_enum {
item1, item2, ..., itemn, last_
};
我希望能够轻松地在my_enum
和int
之间进行转换
(用于映射/定位),例如static_cast<size_t>(enum_object)
。现在,用n
表示的时间复杂度是多少
这个手术?是O(n)
还是O(1)
?
甚至更奇怪的建议是,到O(log(n))
是否存储map<my_enum,size_t>
之类的内容?
答案 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 ++中,甚至没有简单的方法来计算没有额外的“计数”枚举数或宏的枚举数。