Re[2]: Отчет
От: techgl  
Дата: 06.03.17 18:28
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Желающим посмотреть на мою попытку, пожалуйста: https://ideone.com/fRkqnw

MTD>Буду рад услышать почему мне больше не надо писать на С++ )))
А можешь дать ссылку на gist, которую им послал? Там же и комментировать удобнее/
Re[8]: Школа С++ от UNIGINE
От: alex_public  
Дата: 06.03.17 19:15
Оценка:
Здравствуйте, placement_new, Вы писали:

_>>1. Писать сейчас на C++ что-то заточенное под конкретную платформу весьма странно (если конечно же речь не о чём-то совсем системном, типа драйверов).

_>А ты точно С++ программист?
_>Например, facebooл https://github.com/facebook/folly
_>Как ты думаешь, пишут ли они кроссплатформенный С++ под Windows?

Хы, вот прямо по твой ссылке на первой же странице идёт в начале описание того как собрать их библиотечку под Ubuntu, а потом как собрать под OS X. Т.е. опять же пример кроссплатформенного ПО, как я и говорил. А уж если взглянуть сюда https://github.com/facebook/folly/blob/master/folly/portability/Windows.h, то становится совсем интересно. )))
Re[6]: Школа С++ от UNIGINE
От: techgl  
Дата: 06.03.17 19:27
Оценка: 1 (1) +1
Здравствуйте, alex_public, Вы писали:

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

А можно взглянуть на gist который за 20 минут пишется, с поддержкой UTF-8 для русского языка? А то что-то слабо верится в такой маленький срок именно из-за UTF-8.
Re[3]: Отчет
От: MTD https://github.com/mtrempoltsev
Дата: 06.03.17 19:38
Оценка: 1 (1)
Здравствуйте, techgl, Вы писали:

T>А можешь дать ссылку на gist, которую им послал? Там же и комментировать удобнее/


Увы, не сохранил. Вот новая: https://gist.github.com/anonymous/4fdca79b7a79efd35db137de5a73905c
Re[9]: Школа С++ от UNIGINE
От: placement_new  
Дата: 06.03.17 19:39
Оценка:
Здравствуйте, alex_public, Вы писали:


_>Хы, вот прямо по твой ссылке на первой же странице идёт в начале описание того как собрать их библиотечку под Ubuntu, а потом как собрать под OS X. Т.е. опять же пример кроссплатформенного ПО, как я и говорил. А уж если взглянуть сюда https://github.com/facebook/folly/blob/master/folly/portability/Windows.h, то становится совсем интересно. )))


OS X я рассамтриваю как часть Linux/Unix
Просто попробуй ее использовать ее под windows...
Да, и кстати, сделали то они это совсем не давно, что как бы намекает также...

Внутренние инфрастуктурные проекты, если они пишутся на C++, почти никода не пишутся кроссплатформенными. Да, могут подготовить какой то соломки в случае чего, но на серверах то везде Linux.

Это и дает мне повод сомневаться.
> Писать сейчас на C++ что-то заточенное под конкретную платформу весьма странно (если конечно же речь не о чём-то совсем системном, типа драйверов).
Отредактировано 06.03.2017 19:58 placement_new . Предыдущая версия . Еще …
Отредактировано 06.03.2017 19:53 placement_new . Предыдущая версия .
Отредактировано 06.03.2017 19:46 placement_new . Предыдущая версия .
Отредактировано 06.03.2017 19:44 placement_new . Предыдущая версия .
Re[6]: Школа С++ от UNIGINE
От: MTD https://github.com/mtrempoltsev
Дата: 06.03.17 19:41
Оценка:
Здравствуйте, alex_public, Вы писали:

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


Пожалуйста, покажи код, буду очень признателен.
Re[4]: Отчет
От: techgl  
Дата: 06.03.17 19:53
Оценка: 11 (3) +1
Здравствуйте, MTD, Вы писали:

MTD>Увы, не сохранил. Вот новая: https://gist.github.com/anonymous/4fdca79b7a79efd35db137de5a73905c

Мне пришел позитивный ответ от школы. Вот мой вариант, без UTF-8.
Сначала хотел в gist написать, но думаю проще будет здесь. У тебя мне не понравилось:
1. Сортировка через map
2. Использование getline() вместо прямой работы с потоком
3. Использование конкатенации на строке через +=
Хотелось бы услышать твое мнение про мой код.
Re[5]: Отчет
От: MTD https://github.com/mtrempoltsev
Дата: 06.03.17 20:22
Оценка:
Здравствуйте, techgl, Вы писали:

T>1. Сортировка через map


Думаешь положить в вектор и затем отсортировать будет быстрей?

T>2. Использование getline() вместо прямой работы с потоком


Да, соглашусь.

T>3. Использование конкатенации на строке через +=


А это, чем тебе не понравилось?

T>Хотелось бы услышать твое мнение про мой код.


Все ок, чисто, понятно. Не понравилось только дублирование строк — у тебя в map лежит ключ, а затем еще и копия в Counter, причем Counter тоже в двух экземплярах — и в мапе и в векторе. Итого получаем тройной расход памяти, если нет cow, а таких гарантий вроде как нет.
Re[8]: binstream и GNU/Linux
От: Qbit86 Кипр
Дата: 06.03.17 20:48
Оценка:
Здравствуйте, placement_new

Q>>Эти ребята из окологеймдева. В геймдеве 9 из 10 пишут на Windows.


С другой стороны, у них в команде работал (а может и поныне там) некий binstream, энтузиаст и популяризатор GNU/Linux.
Глаза у меня добрые, но рубашка — смирительная!
Re: Школа С++ от UNIGINE
От: Masterspline  
Дата: 07.03.17 05:03
Оценка:
Мой appveyor.yml, чтобы использовать "Онлайн Компилятор" appveyor.com, CMakeLists.txt и так должен быть, ненужные команды можно удалить, но с ними красивее.

image: Visual Studio 2013
environment:
  DEGREE_OF_PARALLELISM: 3
  matrix:
  - GENERATOR: Visual Studio 12 2013
    CONFIG: Release

configuration: Release
build_script:
  - mkdir build
  - cd build
  - cmake .. -G "%GENERATOR%"
  - cmake --build . --config %CONFIG%
  - cmake -E copy ../in.txt .
  - dir
  - dir Release
  - Release\freqs in.txt out.txt
  - cat out.txt
Re[2]: Отчет
От: rumit7  
Дата: 07.03.17 05:08
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Во-первых, сам код на 99% никто не смотрел, просто запустили компиляцию — не прошла, свободен. Из этого вывод — не надо было ради мифических бонусов добавлять поддержку русского в utf-8, справился бы тогда за пол часа и не так было бы обидно.


Хорошо, что я не стал тратить на них свое время — сделать просто без utf-8 — лень уж слишком просто, а сделал бы с utf-8, тоже какой-нибудь супер-подобранный тест завалил бы)))

MTD>Желающим посмотреть на мою попытку, пожалуйста: https://ideone.com/fRkqnw

MTD>Буду рад услышать почему мне больше не надо писать на С++ )))

Так им там такие опытные и не нужны, еще и закомплексуют.. Что они Вам смогут про реализацию stl рассказать? Очень сомневаюсь, что не получится наоборот. Подождем выложенных лекций, может и вправду интересно будет..
Re[6]: Отчет
От: rumit7  
Дата: 07.03.17 05:12
Оценка: -1
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, techgl, Вы писали:


T>>1. Сортировка через map


MTD>Думаешь положить в вектор и затем отсортировать будет быстрей?


преждевременная оптимизация, разве нет? где-то есть требования или результаты профилирования?

T>>2. Использование getline() вместо прямой работы с потоком


MTD>Да, соглашусь.


Интересно, почему согласились? Разве код с get_line не проще? Или есть еще что-то?

T>>3. Использование конкатенации на строке через +=


по моему преждевременная оптимизация от Уважаемого techgl
Re[7]: Отчет
От: MTD https://github.com/mtrempoltsev
Дата: 07.03.17 05:26
Оценка: +1
Здравствуйте, rumit7, Вы писали:

T>>>1. Сортировка через map


MTD>>Думаешь положить в вектор и затем отсортировать будет быстрей?


R>преждевременная оптимизация, разве нет? где-то есть требования или результаты профилирования?


Что именно является преждевременной оптимизацией? На мой взгляд это просто два разных подхода к решению, оба имеют право на жизнь, что эффективней не знаю, надо исследовать.

R>Интересно, почему согласились? Разве код с get_line не проще? Или есть еще что-то?


С потоком было бы не сложней и, да, как-то посимпатичней.

T>>>3. Использование конкатенации на строке через +=


R>по моему преждевременная оптимизация от Уважаемого techgl


Это вообще никакая не оптимизация, += в строке — аналог push_back в векторе.
Re[5]: Отчет
От: rumit7  
Дата: 07.03.17 05:29
Оценка:
Здравствуйте, techgl, Вы писали:

T>Мне пришел позитивный ответ от школы. Вот мой вариант, без UTF-8.


Я так понял, Counter Вам только для того, чтобы легче все загнать в vector и сортануть это все исп-я std::sort. При этом соглашаетесь хранить слово 3 раза. И все ради мифической эффективности? Или есть другие причины?

По мне вариант с изначальным хранением в std::map<std::string, size_t> получше.. Хотя Вас вот взяли туда, а я даже не пробовал))
Re[8]: Отчет
От: rumit7  
Дата: 07.03.17 05:35
Оценка:
Здравствуйте, MTD, Вы писали:

Подождем комментарии Уважаемого techgl, мне показалось он именно на оптимизацию давил когда говорил про "положить в вектор и затем отсортировать" и про "Использование конкатенации на строке через +=". Мне его доводы пока не понятны..

MTD>С потоком было бы не сложней и, да, как-то посимпатичней.


Мне наоборот в Вашем коде понравилось исп-е get_line.
Re[7]: Школа С++ от UNIGINE
От: AlexGin Беларусь  
Дата: 07.03.17 05:47
Оценка: +2
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, kaa.python, Вы писали:


KP>>Найти новый, чисто Windows проект на C++ в последнее время штука довольно не тривиальная. Большинство современных C++ проектов кроссплатформенные и разработка ведется на наиболее удобной для разработчиков платформе.


_>Вот, наконец то совершенно правильное высказывание. А то прямо странно было читать потоки бреда в данной теме. C++ — это в настоящее время самый кроссплатформенный язык из всех существующих.

+100500
_>И из этого следует два очевидных факта:
_>1. Писать сейчас на C++ что-то заточенное под конкретную платформу весьма странно (если конечно же речь не о чём-то совсем системном, типа драйверов).

Да, уважаемый alex_public, это именно так, если разрабатывать проекты уровня "Hello world!".
Для более-менее средних проектов (я не говорю насчёт крупных) — начинается привязка к системе.
В этом случае — кроссплатформенность "ради спортивного интереса" — дело весьма затратное.

_>2. ОС установленная у разработчика выбирается исключительно по его личным вкусам (как пользователя ОС, а не как программиста), а не из соображений целевой платформы для разрабатываемого им ПО. Ну а для тестирования разрабатываемого ПО очевидно должно служить множество виртуалок. )


Вот, например, я тимлид команды, в которой разрабатываем проект на Qt под Windows.
Я предположил, что в моей рабочей группе, один из девелоперов "по его личным вкусам" поставит Linux и на нем Qt Creator (это его выбор, я не мешаю).
Попутно заметим, что у всех остальных, в том числе и у меня, — Qt пакет на MSVC.
Внимание вопрос:
Заниматься адоптацией gcc <-> MSVC кто будет?
Ответ:
Тот самый девелопер, у которого "Linux и на нем Qt Creator" Hint: от всех обязянностей по разработке на проекте его НИКТО НЕ ОСВОБОЖДАЛ...

P.S. Если у разработчика есть личные вкусы по Linux — у него есть выбор: виртуалка либо dual-boot.
Но разработка — именно на той системе, что установлена у end-user-а.
Отредактировано 07.03.2017 6:04 AlexGin . Предыдущая версия .
Re[6]: Отчет
От: techgl  
Дата: 07.03.17 06:44
Оценка: 2 (1)
Здравствуйте, MTD, Вы писали:

T>>1. Сортировка через map

MTD>Думаешь положить в вектор и затем отсортировать будет быстрей?
На мой взгляд это неправильно с точки зрения семантики когда сортировка идет через структуру данных. По сложности и там и там должно быть одинаково. В вектор приходится ложить исключительно из-за реализации map. В Java, например, можно получить как список ключей, так и список значений сразу.

T>>3. Использование конкатенации на строке через +=

MTD>А это, чем тебе не понравилось?
Обычно конкатенация в цикле это плохо, я в таком случае использую строковый буфер, он оптимизирован под эту операцию.

T>>Хотелось бы услышать твое мнение про мой код.

MTD>Все ок, чисто, понятно. Не понравилось только дублирование строк — у тебя в map лежит ключ, а затем еще и копия в Counter, причем Counter тоже в двух экземплярах — и в мапе и в векторе. Итого получаем тройной расход памяти, если нет cow, а таких гарантий вроде как нет.
Я исходил из того что в естественных языках слова не длинные и их обычно не более 50000-100000 тысяч, причем в одном тексте вряд ли сразу встретится много разных слов. Но проблема с повторением строк решаема, просто нужно смотреть какие накладные расходы по созданию кеша строк.
Re[7]: Отчет
От: MTD https://github.com/mtrempoltsev
Дата: 07.03.17 07:03
Оценка:
Здравствуйте, techgl, Вы писали:

T>На мой взгляд это неправильно с точки зрения семантики когда сортировка идет через структуру данных.


Ну не знаю, думаю вопрос религии.

T>Обычно конкатенация в цикле это плохо, я в таком случае использую строковый буфер, он оптимизирован под эту операцию.


Ты видимо с Java пришел? Там, поскольку строки copy on write, то конкатенация означает создание и копирование, в С++ конкатенация просто добавление в конец — сложность константная.

T>Я исходил из того что в естественных языках слова не длинные и их обычно не более 50000-100000 тысяч, причем в одном тексте вряд ли сразу встретится много разных слов. Но проблема с повторением строк решаема, просто нужно смотреть какие накладные расходы по созданию кеша строк.


Ты мог бы хранить строку в одном месте, а в других местах использовать указатель, а так просто ничем не обоснованное пожирание памяти со всеми вытекающими.
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 локаль сразу на всех платформах и компиляторах. )
Re[4]: Отчет
От: alex_public  
Дата: 07.03.17 07:56
Оценка: 4 (1)
Здравствуйте, MTD, Вы писали:

T>>А можешь дать ссылку на gist, которую им послал? Там же и комментировать удобнее/

MTD>Увы, не сохранил. Вот новая: https://gist.github.com/anonymous/4fdca79b7a79efd35db137de5a73905c

Map для сортировки при уже наличие set'a был явно лишний. ) А так да, подтверждаю, код нормально компилируется и работает. Что в принципе большое достижение с учётом наличия в нём этого рукопашного ада с utf8. )
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.