C/C++

Алгоритмы STL. Решение оформить в виде class c конструктором, принимающим строку

подсчитать количество гласных и согласных букв в строке string VOZ = "Аллаху акбар. Ахмат сила";
своего решения к сожалению нет. Помогите люди добрые
#include <iostream>
#include <Windows.h>
using namespace std;

class GSA
{
uint16_t glas{}, soglas{};
int16_t gla_sogla(unsigned char ch)
{
static char anci[256]{};
static bool is_first = true;
if (is_first)
{
const string c_glas = "АаУуОоЫыЭэЯяЮюЁёИиЕе";
const string c_sogl = "БбВвГгДдЖжЗзЙйКкЛлМмНнПпРрСсТтФфХхЦцЧчШшЩщ";
uint16_t i = 0;
for (i = 0; i < 256; i++)
{
if (c_glas.find(i) != string::npos) anci[i] = 1; else
if (c_sogl.find(i) != string::npos) anci[i] = -1;
}
is_first = false;
}
return anci[ch];
}
public:
GSA(const string& str)
{
for (auto& i : str)
{
if (gla_sogla(i) == 1) glas++; else
if (gla_sogla(i) == -1) soglas++;
}
}
const pair<uint16_t, uint16_t> get_result() const
{
return { glas, soglas };
}
};

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
GSA temp("Баобаб Крит ++"); // Или вводите свою строку
cout << "Гласные: " << temp.get_result().first << " Согласные: " << temp.get_result().second;
}
James Curtis
James Curtis
51 416
Лучший ответ
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
class Letters {
public:
static size_t vowels(const string& line) {
return count_if(line.begin(), line.end(), Vowel());
}
static size_t consonants(const string& line) {
return count_if(line.begin(), line.end(), Consonant());
}
private:
inline static const string vow{ "оеаиуяыюэОЕАИУЯЫЮЭёЁ" };
inline static const string con{ "нтсрвлкмдпьгзбчйхжшцщфъНТСРВЛКМДПГЗБЧХЖШЦЩФЙЬЪ" };
struct Vowel {
bool operator()(char ch) {
return vow.find(ch) != string::npos;
}
};
struct Consonant {
bool operator()(char ch) {
return con.find(ch) != string::npos;
}
};
};
int main() {
system("chcp 1251 > nul");
cout << "Введите строку: ";
string line;
getline(cin, line);
const auto vowels = Letters::vowels(line);
const auto consonants = Letters::consonants(line);
cout << "Гласных: " << vowels << '\n';
cout << "Согласных: " << consonants << '\n';
system("pause > nul");
}
Михаил Лавров А моя реализация без этих ваших богомерзких STL и инлайн из С++17 более чем в два раза быстрее (тут следует вставить смех доктора зло) мухахахаха)
для 100 проходов с миллионной строкой 5 секунд против 2-х.
Михаил Лавров Relase: 4.6 vs 2.5 для 100 проходов со строкой в 4М.
Я вначале смутился, ибо без вывода результата ваша программа в релизе оптимизируется до нуля и говорит затрачено 0 секунд. Хехехе
Михаил Лавров Но в итоге моя реализация все равно быстрее. Я уже учел прошлый ваш урок, и прогнал как большим количеством маленьких строк, так и огромными строками. Вот бы еще constexpr втулить в функцию, чтобы массив на компиляции собирала - но что-то ругается на массив.
Михаил Лавров Как сказал бы Его Высоко Преосвященство - Вы прекрасно защищаетесь, сударь.
Для только гласных у вас 1.5, для только согласных 3.1
Выходит вы за Гласность!
Михаил Лавров После некоторых оптимизаций мой код работает за 0.3 секунды.
А именно убрал заполнение массива в отдельную функцию, сам массив запихнул в статик член, функцию прописал как
inline int16_t gla_sogla(unsigned char ch)
{
return *anci+ch;
}
Оказывается что проверка запущена ли функция первый раз дорого стоила...