#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
должна быть achar
.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;
});
}
Вы можете усомниться в производительности второй версии, поэтому я добавляю здесь тест, эти две версии, как правило, одинаковы.