Здравствуйте, MTD, Вы писали:
MTD>Желающим посмотреть на мою попытку, пожалуйста: https://ideone.com/fRkqnw MTD>Буду рад услышать почему мне больше не надо писать на С++ )))
А можешь дать ссылку на gist, которую им послал? Там же и комментировать удобнее/
Здравствуйте, 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, то становится совсем интересно. )))
Здравствуйте, alex_public, Вы писали:
_>А вообще приведённая ими задачка вызывает серьёзные сомнения в уровне предлагаемого курса. Ведь они же там в описание говорят о том, что планируют в процессе курса разбирать её правильное и быстрое написание... А мне вот не понятно, что там можно разбирать, если всё решение целиком можно записать менее чем в 20 строчек кода (причём это без всяких сторонних библиотек, с поддержкой русского utf8 и работой на всех популярных платформах), которые впечатываются наверное минуты за 3 и даже без включения мозга. )))
А можно взглянуть на gist который за 20 минут пишется, с поддержкой UTF-8 для русского языка? А то что-то слабо верится в такой маленький срок именно из-за UTF-8.
_>Хы, вот прямо по твой ссылке на первой же странице идёт в начале описание того как собрать их библиотечку под Ubuntu, а потом как собрать под OS X. Т.е. опять же пример кроссплатформенного ПО, как я и говорил. А уж если взглянуть сюда https://github.com/facebook/folly/blob/master/folly/portability/Windows.h, то становится совсем интересно. )))
OS X я рассамтриваю как часть Linux/Unix
Просто попробуй ее использовать ее под windows...
Да, и кстати, сделали то они это совсем не давно, что как бы намекает также...
Внутренние инфрастуктурные проекты, если они пишутся на C++, почти никода не пишутся кроссплатформенными. Да, могут подготовить какой то соломки в случае чего, но на серверах то везде Linux.
Это и дает мне повод сомневаться. > Писать сейчас на C++ что-то заточенное под конкретную платформу весьма странно (если конечно же речь не о чём-то совсем системном, типа драйверов).
Здравствуйте, alex_public, Вы писали:
_>А мне вот не понятно, что там можно разбирать, если всё решение целиком можно записать менее чем в 20 строчек кода (причём это без всяких сторонних библиотек, с поддержкой русского utf8 и работой на всех популярных платформах), которые впечатываются наверное минуты за 3 и даже без включения мозга. )))
Здравствуйте, MTD, Вы писали:
MTD>Увы, не сохранил. Вот новая: https://gist.github.com/anonymous/4fdca79b7a79efd35db137de5a73905c
Мне пришел позитивный ответ от школы. Вот мой вариант, без UTF-8.
Сначала хотел в gist написать, но думаю проще будет здесь. У тебя мне не понравилось:
1. Сортировка через map
2. Использование getline() вместо прямой работы с потоком
3. Использование конкатенации на строке через +=
Хотелось бы услышать твое мнение про мой код.
Здравствуйте, techgl, Вы писали:
T>1. Сортировка через map
Думаешь положить в вектор и затем отсортировать будет быстрей?
T>2. Использование getline() вместо прямой работы с потоком
Да, соглашусь.
T>3. Использование конкатенации на строке через +=
А это, чем тебе не понравилось?
T>Хотелось бы услышать твое мнение про мой код.
Все ок, чисто, понятно. Не понравилось только дублирование строк — у тебя в map лежит ключ, а затем еще и копия в Counter, причем Counter тоже в двух экземплярах — и в мапе и в векторе. Итого получаем тройной расход памяти, если нет cow, а таких гарантий вроде как нет.
Мой appveyor.yml, чтобы использовать "Онлайн Компилятор" appveyor.com, CMakeLists.txt и так должен быть, ненужные команды можно удалить, но с ними красивее.
Здравствуйте, MTD, Вы писали:
MTD>Во-первых, сам код на 99% никто не смотрел, просто запустили компиляцию — не прошла, свободен. Из этого вывод — не надо было ради мифических бонусов добавлять поддержку русского в utf-8, справился бы тогда за пол часа и не так было бы обидно.
Хорошо, что я не стал тратить на них свое время — сделать просто без utf-8 — лень уж слишком просто, а сделал бы с utf-8, тоже какой-нибудь супер-подобранный тест завалил бы)))
MTD>Желающим посмотреть на мою попытку, пожалуйста: https://ideone.com/fRkqnw MTD>Буду рад услышать почему мне больше не надо писать на С++ )))
Так им там такие опытные и не нужны, еще и закомплексуют.. Что они Вам смогут про реализацию stl рассказать? Очень сомневаюсь, что не получится наоборот. Подождем выложенных лекций, может и вправду интересно будет..
Здравствуйте, MTD, Вы писали:
MTD>Здравствуйте, techgl, Вы писали:
T>>1. Сортировка через map
MTD>Думаешь положить в вектор и затем отсортировать будет быстрей?
преждевременная оптимизация, разве нет? где-то есть требования или результаты профилирования?
T>>2. Использование getline() вместо прямой работы с потоком
MTD>Да, соглашусь.
Интересно, почему согласились? Разве код с get_line не проще? Или есть еще что-то?
T>>3. Использование конкатенации на строке через +=
по моему преждевременная оптимизация от Уважаемого techgl
Здравствуйте, rumit7, Вы писали:
T>>>1. Сортировка через map
MTD>>Думаешь положить в вектор и затем отсортировать будет быстрей?
R>преждевременная оптимизация, разве нет? где-то есть требования или результаты профилирования?
Что именно является преждевременной оптимизацией? На мой взгляд это просто два разных подхода к решению, оба имеют право на жизнь, что эффективней не знаю, надо исследовать.
R>Интересно, почему согласились? Разве код с get_line не проще? Или есть еще что-то?
С потоком было бы не сложней и, да, как-то посимпатичней.
T>>>3. Использование конкатенации на строке через +=
R>по моему преждевременная оптимизация от Уважаемого techgl
Это вообще никакая не оптимизация, += в строке — аналог push_back в векторе.
Здравствуйте, techgl, Вы писали:
T>Мне пришел позитивный ответ от школы. Вот мой вариант, без UTF-8.
Я так понял, Counter Вам только для того, чтобы легче все загнать в vector и сортануть это все исп-я std::sort. При этом соглашаетесь хранить слово 3 раза. И все ради мифической эффективности? Или есть другие причины?
По мне вариант с изначальным хранением в std::map<std::string, size_t> получше.. Хотя Вас вот взяли туда, а я даже не пробовал))
Подождем комментарии Уважаемого techgl, мне показалось он именно на оптимизацию давил когда говорил про "положить в вектор и затем отсортировать" и про "Использование конкатенации на строке через +=". Мне его доводы пока не понятны..
MTD>С потоком было бы не сложней и, да, как-то посимпатичней.
Мне наоборот в Вашем коде понравилось исп-е get_line.
Здравствуйте, 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-а.
Здравствуйте, MTD, Вы писали:
T>>1. Сортировка через map MTD>Думаешь положить в вектор и затем отсортировать будет быстрей?
На мой взгляд это неправильно с точки зрения семантики когда сортировка идет через структуру данных. По сложности и там и там должно быть одинаково. В вектор приходится ложить исключительно из-за реализации map. В Java, например, можно получить как список ключей, так и список значений сразу.
T>>3. Использование конкатенации на строке через += MTD>А это, чем тебе не понравилось?
Обычно конкатенация в цикле это плохо, я в таком случае использую строковый буфер, он оптимизирован под эту операцию.
T>>Хотелось бы услышать твое мнение про мой код. MTD>Все ок, чисто, понятно. Не понравилось только дублирование строк — у тебя в map лежит ключ, а затем еще и копия в Counter, причем Counter тоже в двух экземплярах — и в мапе и в векторе. Итого получаем тройной расход памяти, если нет cow, а таких гарантий вроде как нет.
Я исходил из того что в естественных языках слова не длинные и их обычно не более 50000-100000 тысяч, причем в одном тексте вряд ли сразу встретится много разных слов. Но проблема с повторением строк решаема, просто нужно смотреть какие накладные расходы по созданию кеша строк.
Здравствуйте, techgl, Вы писали:
T>На мой взгляд это неправильно с точки зрения семантики когда сортировка идет через структуру данных.
Ну не знаю, думаю вопрос религии.
T>Обычно конкатенация в цикле это плохо, я в таком случае использую строковый буфер, он оптимизирован под эту операцию.
Ты видимо с Java пришел? Там, поскольку строки copy on write, то конкатенация означает создание и копирование, в С++ конкатенация просто добавление в конец — сложность константная.
T>Я исходил из того что в естественных языках слова не длинные и их обычно не более 50000-100000 тысяч, причем в одном тексте вряд ли сразу встретится много разных слов. Но проблема с повторением строк решаема, просто нужно смотреть какие накладные расходы по созданию кеша строк.
Ты мог бы хранить строку в одном месте, а в других местах использовать указатель, а так просто ничем не обоснованное пожирание памяти со всеми вытекающими.
Здравствуйте, techgl, Вы писали:
_>>А вообще приведённая ими задачка вызывает серьёзные сомнения в уровне предлагаемого курса. Ведь они же там в описание говорят о том, что планируют в процессе курса разбирать её правильное и быстрое написание... А мне вот не понятно, что там можно разбирать, если всё решение целиком можно записать менее чем в 20 строчек кода (причём это без всяких сторонних библиотек, с поддержкой русского utf8 и работой на всех популярных платформах), которые впечатываются наверное минуты за 3 и даже без включения мозга. ))) T>А можно взглянуть на gist который за 20 минут пишется, с поддержкой UTF-8 для русского языка? А то что-то слабо верится в такой маленький срок именно из-за UTF-8.
Да легко) Только я говорил что пишется не за 20 минут, а за 3 минуты. )))
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 локаль сразу на всех платформах и компиляторах. )
Map для сортировки при уже наличие set'a был явно лишний. ) А так да, подтверждаю, код нормально компилируется и работает. Что в принципе большое достижение с учётом наличия в нём этого рукопашного ада с utf8. )