参考官方题解的解法:
class Solution {
public:
int romanToInt(string s) {
unordered_map<char, int> hashs {
{'I' , 1},
{'V' , 5},
{'X' , 10},
{'L' , 50},
{'C' , 100},
{'D' , 500},
{'M' , 1000}, };
int res = 0;
for (int i = 0; i < s.size() - 1; i++) {
int si = hashs.at(s[i]);
if (si < hashs.at(s[i + 1]))
res += -si;
else
res += si;
}
res += hashs.at(s[s.size() - 1]);
return res;
}
};
这里注意.at(kay)和[key]用法的区别
[]在查找不存在的key时会在unordered_map里插入本不存在的键值对,并返回key的引用。它改变了unordered_map,在一些情况下会使unordered_map的迭代器失效。
.at(key) 返回容器中存储的键 key 对应的值,如果 key 不存在,则会抛出 out_of_range 异常。
因此.at()是安全的查找,但由于(),会损失效率。
拓展find()和count()的用法:
find(key) 查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如果 end() 方法返回的迭代器)。
count(key) 在容器中查找以 key 键的键值对的个数。
unordered_map容器用法详解参考:http://c.biancheng.net/view/7231.html