Здравствуйте, 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 локаль сразу на всех платформах и компиляторах. )