C++中能否用枚举处理字符串字符?罗马数字求和实现疑问
罗马数字转整数:枚举用法与性能对比
嘿,咱们一步步拆解你的问题,先解决核心疑问,再修正代码里的问题:
1. 能不能用枚举处理字符串中的字符?
当然可以,但你当前的代码有个关键逻辑错误:你直接把字符串里的char(比如'I',ASCII值是73)和枚举常量(I=1)做比较,这完全是在对比两个不相关的数值,自然得不到正确结果。
要让枚举发挥作用,你需要先把字符映射到对应的枚举值。因为罗马数字的字符固定且数量有限,有两种高效的映射方式:
- 用
switch语句转换字符到枚举值 - 用一个大小为256的数组(覆盖所有ASCII字符),直接通过字符的ASCII码作为下标取值
结合枚举的话,用数组映射的写法会更简洁高效,比如:
#include <iostream> #include <string> using namespace std; int main() { // 用枚举定义罗马数字对应的数值,提升代码可读性 enum RomanNumeral { I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000 }; // 初始化字符到数值的映射数组,默认值为0,仅给罗马字符赋值 int charToNum[256] = {0}; charToNum['I'] = I; charToNum['V'] = V; charToNum['X'] = X; charToNum['L'] = L; charToNum['C'] = C; charToNum['D'] = D; charToNum['M'] = M; string s = "III"; int sum = 0; // 循环到倒数第二个字符,避免i+1越界访问 for (int i = 0; i < s.length() - 1; ++i) { int current = charToNum[s[i]]; int next = charToNum[s[i+1]]; // 小值在大值前时,减去当前值;否则直接累加 if (current < next) { sum -= current; } else { sum += current; } } // 单独加上最后一个字符的数值 sum += charToNum[s.back()]; cout << "sum is: " << sum << endl; return 0; }
另外还要纠正你代码里的一个逻辑漏洞:当小值在大值前时,应该减去小值,而不是直接加next - current——不然会导致后续重复计算next的值,结果出错。同时要注意循环边界,避免访问超出字符串长度的内存。
2. 枚举真的比unordered_map更快吗?
是的,而且性能优势很明显,原因如下:
unordered_map是哈希表实现,每次查询需要计算哈希值,还可能遇到哈希冲突,带来额外开销- 数组映射或
switch的方式是直接内存寻址,纯O(1)访问,没有任何额外计算,速度快得多 - 枚举本身只是定义了一组可读性更强的常量,真正提升速度的是这种直接映射的逻辑,但枚举让代码避免了魔法数字(比如直接写1、5),可读性更好
不过要明确:枚举本身不是性能提升的核心,核心是有限字符的直接映射,但结合枚举能让代码更清晰易维护。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

