ошибка: запрошено преобразование из ‘const char’ в нескалярный тип ‘std::string’ {aka ‘std::__cxx11::basic_string’}

#c #dictionary #stl

Вопрос:

Я хочу посчитать буквы в строке constamp; и сохранить результат в карте.
Но компилятор выдает ошибку:

ошибка: требуется преобразование из ‘const char’ в нескалярный тип ‘std::строка’ {он же ‘std::__cxx11::базовая строка’}

Мой код:

 map<string, int>amp; MakeWordCounter (const stringamp; word, map<string, int>amp; cnt) {
    for (string i : word) {
        cnt[i] = count(word.begin(), word.end(), i);
    }
}
 

Как это сделать?

Комментарии:

1. Цикл for (string i : word) охватывает символы в строке word . Переменная i должна быть a char .

2. Вы хотите разделить входную строку? Каковы ваши входные и ожидаемые выходные данные?

3. Мой ввод: «foobar_aaa», ожидаемый вывод-карта {{«f», 1}, {«o», 2}, {«b», 1}, {«a», 4}, {«r», 1}, {«_», 1}}

4. for (char i : word) { или for (auto i : word) { .

5. Существует также проблема, связанная с тем, что функция объявляется для возврата чего-либо, но на самом деле ничего не возвращает.

Ответ №1:

Разыменованный итератор типа word имеет тип char , мы не можем преобразовать его в строку. И объявление функции может быть более четким, чтобы напрямую вернуть карту.

Ключевым типом здесь является char, нам не нужно использовать string тип, он вводит в заблуждение и является пустой тратой времени.

 std::map<char, size_t> MakeWordCounter(const std::stringamp; word) {
  std::map<char, size_t> counts;
  for (auto ch : word) {
    counts[ch]  ;
  }
  return counts;
}

 

Или мы можем использовать алгоритм STL вместо цикла:

 std::map<char, size_t> MakeWordCounter2(const std::stringamp; word) {
  return std::accumulate(word.begin(), word.end(), std::map<char, size_t>{},
                         [](auto init, char cur) {
                           init[cur]  = 1;
                           return init;
                         });
}
 

Вы можете усомниться в производительности второй версии, поэтому я добавляю здесь тест, эти две версии, как правило, одинаковы.

https://quick-bench.com/q/OSzzp70rBSdlpivEMmMIj0aGJfU

Онлайн-демонстрация