Я пытался преобразовать римское число в int в cpp, используя неупорядоченную карту, чтобы избежать, если еще или переключения. Можно сказать, что я пытался реализовать то, на что опирался в вопросе. Я написал это:
#include<bits/stdc++.h>
using namespace std;
int romanToInt(string s)
{
int result=0;
unordered_map <string, int> roman;
roman["I"] = 1;
roman["V"] = 5;
roman["X"] = 10;
roman["L"] = 50;
roman["C"] = 100;
roman["D"] = 500;
roman["M"] = 1000;
for( int i=0; i < s.length(); i++ )
{
result += roman[s[i]];
}
return result;
}
int main(){
cout << romanToInt("XIII");
}
это не работает, и я не понимаю, что не так. Я пробовал cout << roman["X"] и выдает 10, но когда я передаю s[i] или даже s[1] в качестве аргумента roman, это не работает. Пожалуйста, помогите, так как я не понимаю сообщение об ошибке компилятора и понятия не имею, как решить его самостоятельно.
Ошибка компилятора:
983 | operator[](key_type&& __k)
| ^~~~~~~~
d:\appdata\mingw\include\c++\11.2.0\bits\unordered_map.h:983:29: note: no known conversion for argument 1 from '__gnu_cxx::__alloc_traits<std::allocator<char>, char>::value_type' {aka 'char'} to 'std::unordered_map<std::__cxx11::basic_string<char>, int>::key_type&&' {aka 'std::__cxx11::basic_string<char>&&'}
983 | operator[](key_type&& __k)
| ~~~~~~~~~~~^~~
no known conversion from 'char' to 'std::string'
— это сообщение об ошибке. Вы используете char
там, где ожидается std::string
.
Римские цифры работают не так.
Вот вызов: XCVIII (десятичное число 98). Да, попробуйте числа с цифрами 4 или 9.
А вы знаете, что внутри <bits/stdc++.h>
? Если нет, не используйте его.
Результат индексации std::string
равен char
. Ваш map
имеет ключ std::string
. Когда вы пытаетесь выполнить roman[s[i]];
, он пытается найти char
в отображении с ключом std::string
, что не работает (для char
в std::string
не определено неявное преобразование). Самое простое решение — изменить map
на char
здесь:
unordered_map<char, int> roman; // Change string to chat
roman['I'] = 1; // Change double-quotes to single-quotes so you're using char
roman['V'] = 5; // Do it for all of them
// ...
roman['M'] = 1000;
Вы также можете немного сократить и оптимизировать код, создав unordered_map
напрямую и сделав его static
таким, чтобы он не перестраивался при каждом вызове, заменив весь приведенный выше код просто:
static unordered_map<char, int> roman{{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
s[i]
этоchar
, а неstd::string
.