Количество вхождений каждого символа С++
нужно подсчитать количество вхождения каждого символа. Например дана строка "Hello world" Должно вывести (h,1),(e,1),(l,3) и так далее. ВАЖНО ! Нельзя использовать циклы. Можно сделать через vector. Буду очень благодарен за помощь.
Ответы (2 шт):
Автор решения: Maggot
→ Ссылка
Возьмите std::map и пробегитесь по строке,приэтом добовляя в нее новые литералы и инкрементируя их кол-во
Для удобвства вы можете поменять все регистры на нижний используя std::tolower если Вам это нужно!
Вот пример кода
#include <iostream>
#include <string>
#include <map>
#include <functional>
#include <locale>
int main() {
std::string line{"Hello World"};
std::map<char, int> m;
std::map<unsigned char, int> m_lower;
std::locale loc;
auto f_obj_all_symb_to_lower{[&](char ch){
if(!std::isspace(static_cast<unsigned char>(ch))) {
unsigned char to_add = std::tolower(static_cast<unsigned char>(ch), loc);
m_lower[to_add]++;
}
}
};
auto f_obj{[&](char ch){
if(!std::isspace(static_cast<unsigned char>(ch))) {
m[ch]++;
}
}
};
std::for_each(std::begin(line), std::end(line), f_obj);
std::for_each(std::begin(line), std::end(line), f_obj_all_symb_to_lower);
std::cout << "Real reg" << std::endl;
for (const auto& var : m) {
std::cout << "(" << var.first << "," << var.second << ")" << std::endl;
}
std::cout << "To lower" << std::endl;
for (const auto& var : m_lower) {
std::cout << "(" << var.first << "," << var.second << ")" << std::endl;
}
return 0;
}
Автор решения: Woji
→ Ссылка
Может кому-то нужно будет вот код:
std::string str = "Hello world";
std::map<char,int> myMap;
std::for_each(str.begin(),str.end(),[&myMap,&str](int i){
myMap[str[i]]++;
});