Анализ текстового файла

Данная программа анализирует текстовый файл содержащий художественное произведение. Файл должен иметь имя “example.txt” и находиться в одной директории с программой.

Программа читает текст, подсчитывает число различных слов в произведении. Показывает как часто встречается каждое слово. Вывод слов осуществляется в алфавитном порядке и в порядке по уменьшению частоты употребления.

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

Функция outText выводит любые контейнеры и list и map, т.к. оформлена как шаблонная функция и может ограничивать вывод либо по числу строк, либо по появлению элементов счетчик которых равен 1.

#include <iostream>
#include <sstream>
#include <fstream>
#include <map>
#include <list>
#include <vector>
#include <string>
#include <algorithm>

template <typename T>
void outText(T ar, int maxStr = 0, bool find1 = false) {
    using std::cout;
    using std::endl;

    int i{};
    int nStr{}; //номер строки
    for (auto it : ar) {
        cout.width(20);
        cout << it.first << " => " << it.second;
        if (i++ >= 3) {
            cout << endl;
            i = 0;
            if ((maxStr > 0 && nStr++ > maxStr) || (find1 && it.second == 1))
                return;
        }
    }
}

int main()
{
    using std::cout;
    using std::endl;
    using std::string;

    setlocale(LC_ALL, "Russian");

    typedef std::map<std::string, int>  mapT;

    std::ifstream myFile("example.txt", std::ios_base::in);
    mapT my_map{};
    mapT::iterator it;

    std::string str{};

    const char* strArrSimv = ".,()<>:!«»-;?";   //знаки препинания, которые убираем из текста

    int npos{};

    if (myFile) {
        while (!myFile.eof()) {
            while (myFile >> str) {
//                cout << str << endl;  //вывод из потока сырых данных
                npos = 0;
                while ((npos = str.find_first_of(strArrSimv, npos)) != std::string::npos) {
                    str.erase(npos);
                }
                std::transform(str.begin(), str.end(), str.begin(), [](auto c) { return std::tolower(c); });
                str[0] = std::toupper(str[0]);
                it = my_map.find(str);
                if (it != my_map.end())
                    my_map[str] += 1;
                else {
                    if (str.length() > 2)
                        my_map.insert(std::make_pair(str, 1));
                }
            }
        }
        cout << endl << endl;
        cout << "Всего слов: " << my_map.size() << endl;

        std::list<std::pair<std::string, int>> my_list{};  

        copy(my_map.begin(), my_map.end(), std::back_inserter(my_list));//копируем содержимое my_map в контайнер list

        outText(my_map);

        cout << endl << "После сортировки" << endl << endl;

        my_list.sort([](auto a, auto b) {return a.second > b.second; });   // сортировка для list с использованием лямбда функции

        outText(my_list, 0, true);
        cout << endl << endl << "Наиболее часто встречающиеся слова:" << endl << endl;
        outText(my_list, 3);
    }
    else {
        cout << "Файл не найден.";
    }
    cout << endl;
}