Re[7]: Школа С++ от UNIGINE
От: alex_public  
Дата: 07.03.17 07:45
Оценка: 15 (6) +1
Здравствуйте, techgl, Вы писали:

_>>А вообще приведённая ими задачка вызывает серьёзные сомнения в уровне предлагаемого курса. Ведь они же там в описание говорят о том, что планируют в процессе курса разбирать её правильное и быстрое написание... А мне вот не понятно, что там можно разбирать, если всё решение целиком можно записать менее чем в 20 строчек кода (причём это без всяких сторонних библиотек, с поддержкой русского utf8 и работой на всех популярных платформах), которые впечатываются наверное минуты за 3 и даже без включения мозга. )))

T>А можно взглянуть на gist который за 20 минут пишется, с поддержкой UTF-8 для русского языка? А то что-то слабо верится в такой маленький срок именно из-за UTF-8.

Да легко) Только я говорил что пишется не за 20 минут, а за 3 минуты. )))
#include <fstream>
#include <unordered_map>
#include <set>

using namespace std;

int main()
{
    locale::global(locale("en_US.UTF-8"));
    
    wifstream ifile("in.txt");
    unordered_map<wstring, uint64_t> words;
    for(wstring s; !ifile.eof();){
        auto c=ifile.get();
        if(iswalpha(c)) s+=towlower(c);
        else if(!s.empty()){
            ++words[s];
            s.clear();
        }
    }

    auto cmp=[](auto& l, auto& r) {return l.second>r.second||l.second==r.second&&l.first<r.first;};
    set<decltype(words)::value_type, decltype(cmp)> sorted_words(words.begin(), words.end(), cmp);

    wofstream ofile("out.txt");
    for(auto& w: sorted_words) ofile<<w.second<<'\t'<<w.first<<endl;
}


P.S. Я не в курсе умеет ли последняя версия убогого продукта от MS работу с utf8 локалями или так ещё и не научился — я под виндой пользуюсь другими компиляторами. Но если до сих пор не умеет (когда я последний раз игрался с ним, не умела), то тогда это тоже можно обойти так: заменить строчку "locale::global(locale("en_US.UTF-8"));" на две строчки "setlocale(LC_ALL, ""); locale::global(locale(locale(), new codecvt_utf8<wchar_t>));". Можно даже ifdef соответствующий сделать. Но это только в рамках данной задачки, в которой стоит условие не использования сторонних библиотек. Если же не трогать это условие, то мы просто сразу подключаем boost.locale и получаем нормальную кроссплатформенную utf8 локаль сразу на всех платформах и компиляторах. )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.