Преобразовать римское число в int в cpp, используя неупорядоченную карту

Я пытался преобразовать римское число в 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)
      |                  ~~~~~~~~~~~^~~
s[i] это char, а не std::string.
tkausl 05.04.2023 02:27
no known conversion from 'char' to 'std::string' — это сообщение об ошибке. Вы используете char там, где ожидается std::string.
Drew Dormann 05.04.2023 02:28

Римские цифры работают не так.

jarmod 05.04.2023 02:29

Вот вызов: XCVIII (десятичное число 98). Да, попробуйте числа с цифрами 4 или 9.

Thomas Matthews 05.04.2023 02:41

А вы знаете, что внутри <bits/stdc++.h>? Если нет, не используйте его.

Thomas Matthews 05.04.2023 02:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
5
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Результат индексации 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}};

Другие вопросы по теме