Скоро, очень скоро Старый ОП, который Насаждал к искусству жаркий пыл в сердцах, Из Dерьма восстанет, И прекрасен станет Тред, в котором лабы пишут на крестах.
Шапку он наполнит, Свой обет исполнит, Вам на суд являя новые стихи; Музы скальда живы, Но в своих призывах Будьте терпеливы, братья крестухи.
Q: Я хочу тотчас вкатиться, а разбираться буду в процессе. Что я должен делать? Q: Не уверен, что хочу изучать C++. Как мне пощупать его без лишней ебли? A:
Читаешь эту книжку, смотришь упражнения из нее и суешь в онлайн-компилятор. Сообщения компилятора об ошибках копипастишь в гугл, ответы на возникающие у тебя вопросы ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее.
Памятка ньюфагу
Вопросы по синтаксису идут на хуй
Лабы идут на хуй
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй
Все идут на хуй
Хейтер сосет члены на пару со своей мамашей
Небольшие фрагменты кода размещай в треде при помощи тега [code] и жабаскрипт-костыля. Для больших фрагментов используй внешниесервисы.
FAQ
Мотивация
Q: Почему стоит использовать именно C++? A:
Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три:
Скорость
C++ действительно быстрый язык — вместе с C, его прародителем, они с большим отрывом уделывают по скорости все остальные языки высокого уровня. Код на C++, как правило, медленнее аналогичного кода на C приблизительно на 0-20% а в ряде случаев C++ оказывается даже быстрее, причем замедление появляется только при использовании высокоуровневых конструкций (в C++ ты никогда не платишь за то, чего не используешь). Таким образом, если тебе требуется высокопроизводительный код, C++ станет отличным выбором.
Мощь
C++, являясь одним из наиболее выразительных и мощных языков, позволяет использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментов простреливания ноги решения задачи. Как следствие, используя C++, ты можешь не думать о том, как обойти искусственные ограничения языка, а беспрепятственно выбрать наиболее подходящие к ситуации средства.
Популярность
C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Q: Но он же давно устарел! A:
Современный C++ весьма далек от языка, которым он был в 1998 году. В настоящее время кресты живее всех живых, их развитие движется семимильными шагами, а новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими. К сожалению, из-за обилия некачественной литературы по С++, в которой игнорируются новые средства языка, бытует мнение о его "несовременности".
Q: Сейчас все пишут на %languagename, а кресты сосут у него! A:
Нужно понимать, что используемый язык должен соответствовать поставленной задаче. Никому не придет в голову писать на C++ скрипты или веб-фронтенд хотя это вполневозможно, но лишь немногие языки могут соперничать с ним по разнообразию решаемых задач.
Q: Хуле тут так сложно? Я открыл учебник, там какой-то ад! A:
Попробуй учебники, изданные после 2011 года, в которых рассматриваются возможности новых стандартов (C++11 и C++14). Этифичи не только добавили выразительности, но и серьезно упростили жизнь разработчиков. Теперь программировать на C++ стало проще, чем когда-либо! Это не отменяет необходимости прочитать несколько серьезных книжек, чтобы написать на нем что-то годное. Тем не менее, да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Именно высокий порог вхождения повышает твою ценность как специалиста, не позволяя нанять вместо тебя индуса за еду. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
Литература
Q: Окей, я решил вкатиться. Какие же книги мне читать? A:
Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
Для нюфань
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется:
Автор(ы)
Название
Год
Ссылка
Бьерн Страуструп
Программирование. Принципы и практика использования C++
Кроме того, есть еще пара старых добрых учебников для ньюфагов. Часть информации в них устарела, но многие считают, что это компенсируется их большей, по сравнению с современными учебниками, понятностью:
Следует пролистать все перед переходом от лаб к написанию настоящего софта.
Последний пункт есть квинтэссенция ГИБКОСТИ, поэтому стоит прочитать его в любом случае, чтобы охуеть от того, как можно делать:
Автор(ы)
Название
Год
Ссылка
Ален Голуб
Веревка достаточной длины, чтобы выстрелить себе в ногу
Ахтунг!
Предыдущие два раздела дополняют, а не заменяют классические книги о лучших практиках разработки без привязки к конкретному языку (Макконнелл, Uncle Bob, GoF).
Справочники
Наиболее детальные описания языка. Удобно использовать как референс, читать от корки до корки не обязательно:
Q: Я готов начать погроммировать! Куда мне писать код? A:
На этапе написания хэллоуворлдов можно не ебаться с установкой софта, а использовать онлайн-компиляторы: раз, два, три, четыре. Для работы над более серьезными вещами удобнее всего установить какую-нибудь IDE. Ниже приведены несколько хороших вариантов:
Платформа
Название
Описание
Ссылка
Windows
Microsoft™ Visual Studio®
Общепризнанно самая продвинутая и удобная IDE, не имеющая равных по части автодополнения и возможностей отладчика. По ссылкам справа можно скачать бесплатную редакцию последнего выпуска (2015 Community Edition). Кроме того, существуют редакции с расширенными возможностями (Professional и Enterprise). Они стоят сотни денег, но если ты студент вуза, подписанного на Dreamspark Premium, то ты можешь получить их безвоздмездно (то есть даром). Многим новичкам интерфейс студии кажется чересчур сложным, так что обязательно прочти этот гайд, если у тебя возникают проблемы с компиляцией хэллоуворда
Простая, легковесная, кроссплатформенная, швабодная IDE. Менее навороченная, чем студия, но среди бесплатных вне конкуренции. Вероятно, это наилучший вариант для новичка с *nix. Под Windows же требует чуть больше ебли с установкой компилятора MinGW/LLVM
http://codelite.org/, "sudo aptitude install codelite codelite-plugins"
для установки под *nix
Все
CLion
IDE, призванная похоронить Visual Studio пока не особо получается. Она стоит денег, но можно украсть почти не протухшую версию на торрентах или получить бесплатную лицензию на год по скану студбилета, если ты студент. Удобные свистелки и перделки присутствуют. Тормоза и баги присутствуют. Кросплатформенность присутствует
Здесь ты можешь найти все остальные существующие IDE, если ни одна из вышеперечисленных тебе не приглянулась.
Разумеется, установка IDE вовсе не обязательна. Ты можешь использоватьтекстовыйредактор в связке с каким-нибудькомпилятором, выбросить мышку, отрастить бороду и примкнуть к Церкви Святого Столлмана. Но лучше тогда сразу отправляйся в тред сишников, если не хочешь быть обоссанным другими сектантами за использование б-гомерзкого C++.
Q: Не буду я все делать сам! Подавайте сюда софт, который все сделает за меня и подотрет мне жопу! A:
Без проблем:
Статический анализатор, который умеет находить в коде ошибки и неоптимальные места. Швабодный. Есть плагин для Visual Studio
Гугловский фреймворк для автоматизации тестирования
Также не стоит забывать о том, что правильные посоны экономят свое время и нервы, используя мегагодные git и cmake во всех проектах.
Q: Мне надоело писать велосипеды, какие у вас тут популярные либы? Q: Нужно зделать %монструозная_хуйня_нейм, но я обосрался от одной мысли о написании ее с нуля, что же делать? A:
Гляди сюда:
boost
Бесспорно, это самый популярный набор C++-библиотек. Не будет лукавством сказать, что C++ во многом обязан популярностью именно ему. Воистину всеобъемлющий, boost способен удовлетворить твои самые скотские фантазии. В нем есть практически все - от математических функций до сетевых компонент, от инструментов тестирования до динамических типов. Функции для работы с твоей мамашей там тоже есть. Разумеется, все это швабодное и работает на любых платформах. И да, boost является своеобразным инкубатором хороших библиотек, поэтому наиболее удачные из них с большой вероятностью можно будет увидеть после принятия очередного стандарта уже как часть стандартной библиотеки.
Недостатком boost можно считать его размер - более 300 мегабайт. Большинство компонент boost не являются независимыми, и попытка использовать один единственный контейнер обернется фактическим подключением 2/3 всего присутствующего в комплекте. Таким образом, если boost не будет использоваться на полную, лучше юзать другие, более специализированные библиотеки.
Существует швабодный кроссплатформенный фреймворк-надмножество C++ под названием Qt. Он содержит довольно большое количество компонент (для работы с сетью, базами данных, для юнит-тестирования и др.), но киллер-фичей и основным полем его применения являются возможности по разработке графических интерфейсов. Qt сам по себе, как расширение языка, предоставляет для этого более удобные средства, чем обычные библиотеки, а использование специализированных IDE наподобие Qt Creator позволяет в буквальном смысле собирать интерфейсы мышкой, а код писать только по существу.
Тем не менее, использование Qt нельзя однозначно назвать хорошей практикой. Во многом это уже не C++, а другой язык, со своими концепциями и паттернами. Qt-код требует дополнительного препроцессинга при помощи встроенных в Qt утилит (т.н. метаобъектная компиляция), поэтому не получится просто подключить Qt как обычную библиотеку и использовать свой любимый компилятор без дополнительного софта. Нельзя сказать, что это существенное препятствие, но есть мнение, что использование Qt нарушает дух C++, раздувает машинный код и порождает макак-любителей кодогенерации.
В настоящее время основные версии Qt - 4.8 и 5.х, полной обратной совместимости между ними нет как в пистоне, ага.
Несколько специализированных библиотек для часто встречающихся задач. Все — маленькие, быстрые и простые в освоении:
libcurl - сишная библиотека для работы с сетью (существует также curlpp - крестовая обертка для нее, но использовать ее не стоит, ибо разработка заброшена еще в 2009 году)
Q: Я прочитал все вышеперечисленное, теперь я гуру! Что дальше? A:
Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
Сап. Недавно пришлось заново устанавливать вижлу, и во время этого меня заинтриговал пункт по крестам для андроида. Где-то слышал немного про это, но все же. Стоит ли вскрывать эту тему, или забить и для мобильной разработки продолжать учить джаву?
>>798075 Имхо, если ты выбираешь между крестами и жабой для мобильной разработки с нуля, не зная ни того ни другого, то лучше начать с жабы. Во-первых, в NDK тебе все равно потребуются как минимум базовые знания жабы, потому что там осуществляется активное взаимодействие твоего кода с жабным. Во-вторых, из-за общей заточенности андроида под жабу имеет смысл использовать кресты только когда тебе требуется что-то довольно производительное, типа вычислений или игрового движка. Иначе ты просто будешь воевать со своим инструментом, а код будет состоять из адаптеров к жабным методам.
>>798075 Но вообще это интересная тема, так что лучше поставить, если есть лишние 5ГБ. Я поставил, все заработало без ебли, отладка на девайсе работает, эмулятор работает.
Сап, мамкины погроммисты. Нужна помощь, можете обоссать ньюфага. Проблема следующая, начал 2 дня назад изучать С++, короче при попытке вывести стандартный халоворлд в консоли нихуя не выводится, хотя часа два назад всё выводилось как надо, а щас нихуя... В душе не ебу в чём проблема гуглил нихуя толкого не нашёл, может объяснит кто ссаному ньюфагу в чём проблема? #include <iostream> using namespace std; int main() { cout << "Nassal nufagy za sheky!\n"; return 0; }
>>798108 >>798094 Решил проблему добавлением строчки system("pause"); вместо "Точки останова" с ней не выводится нихуя. >>798113 Спасибо, дружок пирожок.
>>798117 > Решил проблему добавлением строчки system("pause"); Ты что ли двойным щелчком запускал консольную программу? Да, крестобляди совсем деградировали.
>>798121 Бьерн Страуструп Программирование. Принципы и практика использования C++ По этой книжке начал вкатываться по совету в ОП посте. >>798123 F5)))))))))))))
>>798125 > F5))))))))))))) Проверил. Какое же все-таки говно эта студия. В консольных C# приложениях после завершения подставляет pause, а в таких же C++ приложениях - нет.
>>798133 > F5))))))))))))) >Проверил. Какое же все-таки говно эта студия. В консольных C# приложениях после завершения подставляет pause, а в таких же C++ приложениях - нет. Ты лалка, Ctrl-f5 нажимай. А вообще, нехуй запускать консольщину из шум. Bash поставь, если линупс не осилил.
Анонусы, помогите советом. Хочу написать мат. либу. Проблема в архитектуре. Вот допустим проц поддерживает AVX2. Логично его юзать. Но как мне все это прописывать? Не буду же я тупо ифами проверять.
>>798255 http://man7.org/linux/man-pages/man8/ld.so.8.html#NOTES Hardware capabilities Some shared objects are compiled using hardware-specific instructions which do not exist on every CPU. Such objects should be installed in directories whose names define the required hardware capabilities, such as /usr/lib/sse2/. The dynamic linker checks these directories against the hardware of the machine and selects the most suitable version of a given shared object.
>>798492 Такую сеть, как в boost::asio, я бы и даром не взял. И вообще, это же вам не примитивные смарт поинтеры, которые всем одинаково хороши, тут каждому нужна своя сеть. Кому-то надо низкоуровщину с сокетами, кому-то - пару легких классов как в libcurl, кому-то - монструозную хуйню с continuations типа касабланки... Поэтому подходить надо очень вдумчиво, а не просто тащить всякое дерьмо в стандарт.
>>798518 Ладно, хуй с ней, с этой сетью, что душе угодно, можно нарыть. Однако, где моя рефлексия, когда ее введут блять, я буду сериализовать все классы.
>>798560 запили реализацию в clang, допили существующие пропосалы, вот и появится. Стандарт - это ж некоммерческий opensource, на обычных мимокрокодилах все держится.
>>798675 Вот уж действительно манямирок. Только у тебя. Если бы организации плотно инвестировали время разработчиков в C++, у нас бы давно был аналог .NET или Swift. Это ясные примеры того, как впрягаются большие компании. А у нас есть полурандомы из гугла, эппла, мс, которые на своей инициативе пилят стандарт. Концепты - 3.5 анонимуса, networking - 3.5 анонимуса, модули - по 5 анонов в гугле и мс. Диапазоны - вообще 1, лол.
>>798693 Не, дотнет-то я ещё понимаю, гигантская платформа на все случаи жизни и тд. Но что в этом перечислении делает свифт-то? Кусок говна, который меняется со скоростью дорелизного раста и на нём не написано ничего кроме пары гуй-приложунек? даже интерфейсы cocoa и foundation до сих пор ненативные. Так же криво развивался разве что D – только у него не четырёх сотен миллиардов долларов за спиной.
Тут можно привести в пример Go – сам язык говно, но вы понели.
>>798722 Я согласен, что swift как-то ниоче, просто привел его как пример, когда впрягается большая компания. Go можно отнести туда же. А вот D - это как раз хороший пример хорошего языка, на который похуй корпорациям.
>>798730 2 стандартные библиотеки, вечно молодой, пьяный и меняющийся язык, куча разных компиляторов. До недавних пор кроме DMD не было ни одного полноценно работающего компилятора, поддерживающего хотя бы половину позапрошлого стандарта.
Тот же Брайт только и занимался и занимается тем что коммитит "уменьшение аллокации памяти на 0,7% в функции" вместо развития стандартной библиотеки и инфраструктуры. До срача на, блядь, реддите несколько лет назад бы ужасно текущий GC. Сейчас до сих пор 3 человека не могут сойтись во мнении – сделать всё таки нормальный сборщик, продолжать сосать хуй из-за оверхеда барьеров записи в 1-5% для тех, кто не использует этот самый сборщик при том что язык без него полноценно не работает, или всё таки запилить 2 бинарно несовместимые версии.
>>798773 А что не так-то? Нюфаг в ди коммунити не верит? Врёти? Или читать не умеем и определять пршедшее время? Они были одной из главных проблем в развитии языка. То что сейчас она одна – несколько поздновато.
>>798787 Ну, я меня интересует текущий вариант D - D2. Что там творилось в D1 10 лет назад - меня слабо волнует. На данный момент это охуенный язык с охуенными фичами и охуенной стандартной библиотекой.
>>798789 У тебя серьёзные баги в мозгах видимо. Всё кроме первого абзаца кстати и к настоящему времени относится, комунити-драйвен язык, все дела. не гори ток
Библиотека там хорошая разве что по сравнению с плюсовой. Паравозик немножко уехал.
>>798796 Но это ты горишь, мань. Я так понял - у любителей разрабатывать анал крестом - только один аргумент "ГЦ кококо". Интересно, когда его окончательно сделают опциональным - что они тогда кукарекать будут?
>Библиотека там хорошая разве что по сравнению с плюсовой По сравнению с любой. Она даст на крык крестовой, растовой, жабьей. Кому еще? Кто там остался?
>>798798 В растовой и плюсовой ничего и нету – только затычки к языку. Про жабную – даже не смешно.
Из разговора о проблем в развитии ты где-то углядел срач о GC и его выпиле. Ну ладно – сходи на старый форум digital mars и полистай его. Обсуждения этой темы с "опциональностью сборщика", его допилом и пр. идут уже не первый и даже не второй год. Если не поленишься получишь картину, что Брайт с компанией за люди, и почему D – долгострой который никогда не построится.
Алсо, у языка так же проблемы с его местом в этом мире – предназначения для него банально нет. На дворе 2к16, и "у нас есть алгол60 и больше нихуя" уже не котируется, даже у самых убогих высеров вроде Говна оно есть.
>>798798 >что они тогда кукарекать будут? Да то же, что и всегда. Нет оценки объективнее, чем оценка комьюнити. Если все голосуют ногами за СТАРЫЕ И ПРОТУХШИЕ КРЕСТЫ, то можно сколько угодно оправдываться и изображать доктора Зло - народ-то не обманешь бенчмарками и сладкими обещаниями.
>>798817 >аргументы уровня "миллион мух не может ошибаться" Все и за путина ногами голосуют, следуя твоей логике - он охуенен и пиздат. И айфоны скупают пачками, жрут дерьмо уровня "вы можете зарядить свой телефон только своей зарядкой", и радуются.
>>798817 >Если все голосуют ногами за СТАРЫЕ И ПРОТУХШИЕ КРЕСТЫ Про звено запаздывания слышал? Если сейчас все кинутся голосовать ногами за другое - результат ты увидишь далеко не сразу.
>>798821 Языку еще нет 10 лет, лол, проекта ему крупного за 10 лет не написали.
>>798818 Путин вполне себе охуенен в своей нише, и айфоны сделали много хорошего. Это как раз многое о тебе говорит, что тебе главное быть не таким как все. Ну тогда брал бы действительно интересные и прикольные языки, Nim тот же. А D слишком мало отличается от крестов чтобы 1.5 фичи позволяли отказаться от 30-ти летней кодобазы крестов и сорокалетней сишки.
>>798822 >Языку еще нет 10 лет, лол, проекта ему крупного за 10 лет не написали. Ох, ох, погоди, я и забыл, что ему не 10, а 9 лет. Это действительно многое меняет.
>>798818 >следуя твоей логике - он охуенен и пиздат Он успешно справляется с задачами, на которых другие обосрались, точно такая же ситуация с крестами. И в обоих случаях есть раскачивающие лодку неосиляторы, которые пытаются выдать разрозненные попытки перепила за рабочую альтернативу. >И айфоны скупают пачками Опять же, айфоны лучше всех справляются с ролью дорогой и статусной игрушки, с которой не нужно пердолиться. Хотя здесь я уже и сам не фанат. >>798822 >Если сейчас все кинутся голосовать ногами за другое Кинутся, когда придумают что-то получше. Так было с Фортраном, скинутым с пьедестала, например. И с жабой. Раз не голосуют (а TIOBE не наебешь - не голосуют), значит, пока не придумали. Думайте дальше, господа. >проекта ему крупного за 10 лет не написали Ну ничего, мы подождем. А скорость выпуска крупных проектов на крестах спишем на статистические флуктуации.
>>798833 >точно такая же ситуация с крестами Хуй там. Ты пытаешься обрисовать ситуацию, как будто кресты были охуенны в свое время и потому взлетели. Хуй там - взлетели они исключительно потому, что была повсюду сишка - а кресты были практически ее надмножеством, макак переучивать не нужно, даже сишная блевотина компилится крестовым компилятором.
Только и всего. Не приписывай крестам имбопиздатость - они просто взлетели паразитируя на популярности си.
>>798837 Не, я просто написал хуйню твоего размаху. >>798838 >даже сишная блевотина компилится крестовым компилятором. Я тебя сейчас разочарую, но в крестах изначально не было кучи сишной хуйни вроде автоматического приведения типов, и нет – не компилировалось.
>>798838 Это не совсем так. Кресты взлетели по совокупности факторов. Помимо популярности сишки был общий хайп на ООП и, что важнее, общая философия крестов по вбиранию фич и парадигм из других языков. На более мощный язык всегда легче мигрировать, поэтому отбрасывание фич в угоду безопасности или еще какой хуйне это тупиковый путь. Имхо, конечно, а так поживем - увидим.
>>798838 Кресты были охуенны - Страуструп придумал как сделать симульное ООП эффективным (а симула - это первый ооп-язык, а не хипстерский тормозной смолток, который и тогда был тормозным, и сейчас) с помощью VMT. >макак переучивать не нужно Да ты сам тупая макака, но при этом имеешь наглость обвинять программистов, которым не переучиваться нужно, это хуйня, им нужно ПЕРЕПИСЫВАТЬ КОД. Диванные теоретики типа тебя всегда почему-то об этом забывают, что программисты пишут код, пишут кодами, и потом им пользуется, для них кодирование - это пет-проекты длиной по месяцу. Про тебя история. Но нет, все макаки кроме я.
>>798851 У меня у самого приложения пишутся на Obj-C++, но не потому что мы так премся от этого языка, а потому что единственный способ взаимодействовать с их гуйней. Но дело не в этом >Swift может использовать рантайм Objective-C, что делает возможным использование обоих языков (а также С) в рамках одной программы Т.е. в аппле умные люди сидят, они не заставляют выкидывать кодобазу, а позволяют постепенный переход. А ди требует меня отказаться. Я кстати с одним из разработчиков свифта знаком, крестоблядь как я, мы вместе хуисосили D с ним.
Поясните, нахуя было выдумывать move-семантику, rvalue-ссылки, perfect forwarding и т.д., когда можно было просто запретить автоматические объекты передавать только указатели, как в obj-c?
>>798845 Не при чем, это напоминание о том, что корпорации могут себе позволить переписывание легаси. Таким образом, раз уж не метнулись переписывать все на D, значит, вероятно, дело не только в жестокости мира, а, например, в объективных недостатках D, о которых писал анон выше.
>>798856 >Таким образом, раз уж не метнулись переписывать все на D, значит, вероятно, дело не только в жестокости мира, а, например, в объективных недостатках D, о которых писал анон выше Раз не кинулись все переписывать на с++ - тогда дело в недостатках с++.
>>798857 >Раз не кинулись все переписывать на с++ - тогда дело в недостатках с++. В тот момент и не надо было, можно было просто сделать 'extern "C"' и дополнять легаси на более удобном языке.
>>798863 Алсо, сейчас это сделать - можно в полуавтоматическом режиме. А если не переписывать, то можно свободно дополнять на C++, но вот только Линус против.
>>798856 Что самое прикольное - D свои недостатки исправит. А кресты так и останутся парашей, которая компилируется часами, с говном вместо шаблонов и залупой на воротник вместо модульности.
>>798870 >А кресты так и останутся парашей, которая компилируется часами, с говном вместо шаблонов и залупой на воротник вместо модульности. Смешно будет, когда модули и концепты выкатят хотя бы в виде TS (а это будет уже в течении года). Ведь тогда окажется, что C++ от своих проблем избавился и все такой же популярный, а D - тоже без недостатков, только вот нахуй не нужен будет.
>>798875 >Ведь тогда окажется, что C++ от своих проблем избавился От бесконечного времени компиляции и груза обратной совместимости он не исбавится никогда. Все, чего к нему смогут прикрутить сверху - будет прикручено костылями, потому как изначально в языке не предполагалось.
D это как вяленый, а кресты - как X. Придет время - и иксы отправятся на помойку.
>>798881 Мань, ты высказал утверждение - тебе его и доказывать. Так я тебе могу сказать, что я ебал твою мамку - опровергнуть ты это не сможешь, а за пруфами я темя в гугл отправлю.
>>798879 >От бесконечного времени компиляции и груза обратной совместимости он не исбавится никогда Манька не в курсе, что модули можно использовать уже сегодня и там к тому же инклуды транслируются в импорты на лету для старого кода.
Я скоро буду делать масштабный пулл-реквест в шапку, будет клево, если анон вбросит новых книжек по крестам или еще чего-нибудь. Сейчас планирую вкатить Дьюхерста, и еще нашел охуенный свежачок про оптимизацию кода (2016, на ангельском, что-то на уровне Мейерса или даже выше). Еще думал заняться составлением diff для 17 стандарта на человеческом языке, чтобы всякую несущественную хуйню и полностью новые фичи выкинуть, и оставишь мякотку типа изменений в поведении для begin/end и range-based-for, облегчив перекатывание предельно. Если анон желает присоединиться, буду рад.
Ладно, крестухи. Хватит сраться. У меня тут жопа горит от стандарта. Пидоры разрешили reinterpret_cast поинтера на standard-layour struct к поинтеру на её первый мембер. А КАСТИТЬ standard-layour class НЕ РАЗРЕШИЛИ, СУКИ.
Теперь из std::type_index указатель на std::type_info легитимно не достать, т.к. std::type_info это class, а не struct, хотя и standard-layout и указатель на std::type_info это его первый и единственный мембер.
Повбывав бы...
Нет, я, конечно, достаю. Но кагбэ это нарушает стандарт.
>>798945 >Почему ты разделяешь понятия class и struct? Хотел уже ответить, но пошёл перечитывать стандарт: A standard-layout struct is a standard-layout class defined with the class-key `struct' or the class-key `class'
Тогда проблемы нет, лол.
> А вообще для классов так кастить действительно нельзя. Vptr, все дела. Я же оговорил, что речь идёт о standard-layout. Кастить разрешено явно: A pointer to a standard-layout struct object, suitably converted using a reinterpret_cast, points to its initial member (or if that member is a bit-field, then to the unit in which it resides) and vice versa.
>>798915 Я хочу, чтобы был исчерпывающий список мест, в которых стало можно/нужно писать по-другому. Иначе можно через пару лет обнаружить, что, скажем, известные тебе ограничения на if-expression уже давно ослаблены. Или наоборот, что запретили твои любимые триграфы. Понятно, что я сейчас утрирую, но там действительно много подобных "тихих изменений", а во всех гайдах обычно пишут только про самые существенные - новые фичи, расшмрения библиотеки etc.
>>798945 Так а что мешает делать vptr в структуре, лол? Это совершенно ортогональные с layout вещи. По стандарту class и struct отличаются только аспектами доступа.
>>798875 > своих проблем Вырвиглазного синтаксиса и богатой истории, со стандартом больше напоминающим законодательство какой-нибудь страны? Сомневаюсь.
>>798958 А кто сказал, что нельзя, лол? Он явно что-то другое имел в виду, говоря структуры. Но если думать о его классах, как об обычных struct/class, то там нельзя кастить указатель на класс на указатель на первый член с помощью reinterpret.
Я смогу после книги Страуструпа написать маленькую програмку (идею уже год вынашиваю), которую действительно можно использовать или меня только числа складывать научат и придётся все самому гуглить?
>>798944 >>798953 Себя я убедил в том, что стандарт разрешает мне так делать. Интересно, какое мнение у ананасов. Моё утверждение, что следующий код легален:
>>799376 >людей, которые сто лет не инициализируют локальные переменные Зачем их инициализировать, если уверен, что ниже они обязательно инициализируются перед использованием?
/usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:245:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'const void ' for 1st argument; take the address of the argument with & operator<<(const void __p) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/system_error:209:5: note: candidate function [with _CharT = char, _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'const std::error_code' for 2nd argument operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __e) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:108:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to '__ostream_type &()(__ostream_type &)' for 1st argument operator<<(__ostream_type& (__pf)(__ostream_type&)) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:117:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to '__ios_type &()(__ios_type &)' for 1st argument operator<<(__ios_type& (__pf)(__ios_type&)) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:127:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'std::ios_base &()(std::ios_base &)' for 1st argument operator<<(ios_base& (__pf) (ios_base&)) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:166:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'long' for 1st argument operator<<(long __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:170:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'unsigned long' for 1st argument operator<<(unsigned long __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:174:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'bool' for 1st argument operator<<(bool __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:178:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'short' for 1st argument operator<<(short __n); ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:181:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'unsigned short' for 1st argument operator<<(unsigned short __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:189:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'int' for 1st argument operator<<(int __n); ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:192:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'unsigned int' for 1st argument operator<<(unsigned int __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:201:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'long long' for 1st argument operator<<(long long __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:205:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'unsigned long long' for 1st argument operator<<(unsigned long long __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:220:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'double' for 1st argument operator<<(double __f) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:224:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'float' for 1st argument operator<<(float __f) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:232:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'long double' for 1st argument operator<<(long double __f) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:270:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to '__streambuf_type ' (aka 'basic_streambuf<char, std::char_traits<char> > ') for 1st argument operator<<(__streambuf_type __sb); ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:502:5: note: candidate function [with _CharT = char, _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'char' for 2nd argument operator<<(basic_ostream<_CharT, _Traits>& __out, char __c) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:508:5: note: candidate function [with _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'char' for 2nd argument operator<<(basic_ostream<char, _Traits>& __out, char __c) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:514:5: note: candidate function [with _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'signed char' for 2nd argument operator<<(basic_ostream<char, _Traits>& __out, signed char __c) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:519:5: note: candidate function [with _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'unsigned char' for 2nd argument operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:556:5: note: candidate function [with _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'const char ' for 2nd argument operator<<(basic_ostream<char, _Traits>& __out, const char __s) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:569:5: note: candidate function [with _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'const signed char ' for 2nd argument operator<<(basic_ostream<char, _Traits>& __out, const signed char __s) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:574:5: note: candidate function [with _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'const unsigned char ' for 2nd argument operator<<(basic_ostream<char, _Traits>& __out, const unsigned char __s) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:628:5: note: candidate function [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::basic_ostream<char>] not viable: no known conversion from '__ostream_type' (aka 'basic_ostream<char, std::char_traits<char> >') to 'basic_ostream<char, std::char_traits<char> > &&' for 1st argument operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/bits/ostream.tcc:321:5: note: candidate function [with _CharT = char, _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'const char ' for 2nd argument operator<<(basic_ostream<_CharT, _Traits>& __out, const char __s) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:497:5: note: candidate template ignored: deduced conflicting types for parameter '_CharT' ('char' vs. 'std::basic_ostream<char>') operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/bits/basic_string.h:5172:5: note: candidate template ignored: could not match 'basic_string' against 'basic_ostream' operator<<(basic_ostream<_CharT, _Traits>& __os, ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:539:5: note: candidate template ignored: could not match 'const _CharT ' against 'ostream' (aka 'basic_ostream<char>') operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT __s) ^ main.cpp:29:46: error: invalid operands to binary expression ('__ostream_type' (aka 'basic_ostream<char, std::char_traits<char> >') and 'ostream' (aka 'basic_ostream<char>')) std::cout << find (v.begin(), v.begin(), 1) << std::cout; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:245:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'const void ' for 1st argument; take the address of the argument with & operator<<(const void __p) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/system_error:209:5: note: candidate function [with _CharT = char, _Traits = std::char_traits<char>] not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'const std::error_code' for 2nd argument operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __e) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:108:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to '__ostream_type &()(__ostream_type &)' for 1st argument operator<<(__ostream_type& (__pf)(__ostream_type&)) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:117:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to '__ios_type &()(__ios_type &)' for 1st argument operator<<(__ios_type& (__pf)(__ios_type&)) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:127:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'std::ios_base &()(std::ios_base &)' for 1st argument operator<<(ios_base& (*__pf) (ios_base&)) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:166:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'long' for 1st argument operator<<(long __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:170:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'unsigned long' for 1st argument operator<<(unsigned long __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:174:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'bool' for 1st argument operator<<(bool __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:178:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'short' for 1st argument operator<<(short __n); ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:181:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'unsigned short' for 1st argument operator<<(unsigned short __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:189:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'int' for 1st argument operator<<(int __n); ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:192:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'unsigned int' for 1st argument operator<<(unsigned int __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:201:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'long long' for 1st argument operator<<(long long __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:205:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'unsigned long long' for 1st argument operator<<(unsigned long long __n) ^ /usr/bin/../lib/gcc/i586-linux-gnu/5.3.1/../../../../include/c++/5.3.1/ostream:220:7: note: candidate function not viable: no known conversion from 'ostream' (aka 'basic_ostream<char>') to 'double' for 1st argument operator<<(double __f) ^
>>799346 >>799361 Хотелось бы еще скрыть компараторы внутри функции и передавать только какое-нибудь ключевое слово, чтобы было понятно, какой использовать
>>799392 Если углубиться, то там вроде бы есть какие-то гарантии про минимальное достаточное выравнивание и последовательность размещения, но это все довольно мутно и неявно, так что я бы просто не стал использовать, чтобы не рисковать.
>>799393 Ну хорошо, remove_if есть (хотя ты и copy_if можешь использовать для тех же целей, там допустимы пересечения коллекции-источника с коллекцией-приемником).
Смотрите, во втором вызове find я передаю пустой диапазон: хотя оба итератора указывают на существующий элемент, но в терминах библиотеки этот диапазон пуст, потому что правая граница не включается. Надо ли добавлять отдельную обработку случая равенства итераторов, чтобы результат такой оказии был корректным?
>>799404 И что в них писать, лол? Нет, я допускаю, что можно придумать монструозную ебалу, которая это проверит на основе существующих недоконцептов, но нахуя, если это в итоге принесет выигрыш в несколько символов всего.
>>799409 >И что в них писать, лол? Размер структуры и размер массива совпадают. По стандарту компилятор паддинг может добавлять куда угодно, но на практике ни один компилятор этого не делает.
>>799420 Вот я и говорил >>799401, что вроде бы там есть ограничения на паддинг, но они мутные какие-то и хорошенько запрятаны. Явного утверждения ЗАПРЕЩЕНЫ ЛИШНИЕ ДЫРКИ там нет.
>>799415 Позиционные системы счисления удобнее для использования в жизни и программирования. Битовые сдвиги бы не работали с римской системой. А то, что петушкам непонятно, что такое отображение списка или дерева, это их проблемы.
>>799456 Паддинг от алайна не зависит по стандарту. Стандарт задает только порядок членов структуры в памяти, но расстояние между ними может быть произвольное.
Есть объявленный, но не определенный вектор. В конструкторе класса мне нужно изменить размер этого вектора и проинициализировать его элементы данным значением. Как это сделать кратко без присвоения вроде v = std::vector(n, val)?
Как std::set может работать как очередь с приоритетами? Оно же реализовано на красно-черном дереве, а бинарные деревья поиска это не кучи. Говорят, что если set хранит пары, то внутри пары упорядочены по первой координате.
>>799742 Не читай этого Василия, он неправильно юзает std::set. Просто потому, что в интерфейсе set'а никакого поведения, похожего на очередь с приоритетами, и близко не планировалось. Также его код говно нечитаемое.
Более того, я очень сомневаюсь, что его код рабочий, но я ебал в рот сидеть и проверять эту поебень.
На пикриле ты можешь увидеть, как должен выглядеть хоть немного понятный код.
Алсо, я не понимаю, нахуя ты лазишь в интернет, когда у Кормена все написано просто заебись (пикрил2).
>>799751 Говно нечитаемое. Нахрен ты лепишь туда макросы, когда ты пишешь ебаный поиск кратчайших путей? Я ебал читать. Визуализация - говно. Слишком нагружено и непонятно. Осиль dot или просто печатай пошагово результирующий массив. Можно видоизменить граф для большей наглядности(храни буквенные идентификаторы), должно получится, как на пикриле.
>>799760 У меня в Кормене алгоритм так записан. Какое-то подзалупное говно с расходом памяти на очередь с приоритетами, содержащую все ребра. Пацаны говорят, что достаточно добавлять по одному ребру в очередь. К тому же у него слишком высокая декомпозиция алгоритма на отдельные функции. Если писать так, как у Кормена, то придется передавать в функцию relax ссылку на очередь. Это слишком грязно.
Когда все хранится в разных областях видимости, такую идеальную декомпозицию без грязи не сделать.
>>799770 Во-первых, нахуя ты полез в серьезную литературу, если ты, блядь, не шаришь ебаный алгоритм дейкстры? Тебя не смущает то, что тебе сложно читать "Построение и анализ"?
Начни с чего-нибудь попроще. Например, с пикрила. Тоже Кормен, но написано намного проще, легче будет вкатиться. Когда осилишь, сможешь легко перекатиться на старшего брата этой книги.
>>799770 >Пацаны говорят, что достаточно добавлять по одному ребру в очередь Можно и так.
>К тому же у него слишком высокая декомпозиция алгоритма на отдельные функции Его декомпозиция совершенна.
>Если писать так, как у Кормена, то придется передавать в функцию relax ссылку на очередь. Это слишком грязно. Не кукарекай, умник. Сперва реализуй алгоритм самостоятельно и, самое главное, правильно. А потом будешь оптимизировать.
>>799778 >Его декомпозиция совершенна. Не спорю, алгоритм хорош, но на мою реализацию он не ложится. Не знаю, как вообще получить опыт реалиазации алгоритмов такого же качества, если получается говно.
>>799778 >Не кукарекай, умник. Сперва реализуй алгоритм самостоятельно и, самое главное, правильно. А потом будешь оптимизировать Я умею проделывать этот алгоритм на бумажке, писал реализацию без очереди с приоритетами, а сейчас хочу разобраться в эффектином варианте Дейкстры. Если его писать на фибоначчиевых кучах, сложность алгоритма вообще достигает теоретического минимума.
>>799779 >но на мою реализацию он не ложится Измени реализацию?
>>799780 >писал реализацию без очереди с приоритетами Щито? Ты писал не алгоритм Дейсктры. Его Дейкстра не с потолка взял - в его основе лежат определенные идеи, которые безальтернативно приводят к необходимости очереди с приоритетами. Вопрос лишь в том, как будет реализована очередь с приоритетами: через массив, бинарную кучу или фибоначчиеву кучу.
Так что твой алгоритм никак не изменится от замены одной реализации очереди на другую.
Алсо, почему на пикче раннеры идут к вершинам, к которым идти не нужно? Или они там от балды натыканы? Алгоритм Дейкстры ведь жадный, он на каждой итерации выбирает ребро наименьшего веса. Судя по пикче, там происходит что-то другое.
>>799791 Алгоритм выбирает ребро наименьшего веса. Следующая итерация начинается с конечной вершины этого ребра. Точно так же ищется самое оптимальное на этом этапе решение, и следующая итерация начинается с самой близкой вершины. Что не так? На картинке явно не это.
>>799789 >Тогда что это? http://e-maxx.ru/algo/dijkstra Алгоритм Дейкстры с очередью с приоритетами. На пикриле можно увидеть основную операцию очереди с приоритетами.
>Алсо, почему на пикче раннеры идут к вершинам, к которым идти не нужно? Боженька не велит? Хуле не нужно-то, алгоритм не видит граф так же как ты.
>Алгоритм Дейкстры ведь жадный Бля, заканчивай гнать умные слова. Впечатление ты на АиБ ни на кого не произведешь. Жадность алгоритмов тебе никак не объяснит, что происходит у Дейкстры. По крайней мере, пока.
>>799805 >Алгоритм Дейкстры с очередью с приоритетами. На пикриле можно увидеть основную операцию очереди с приоритетами Нет, это хуйня, а не очередь с приоритетами. Очередь нужна для извлечения ребра наименьшего веса за O(1), а по ссылке и на пикче - брутфорс. Пиздец наркоманы.
>>799817 На каждой итерации выбираешь ближайшую вершину. Если метку этой вершины можно улучшить, то улучшаешь, делаешь записи в массив, и такие же действия повторяешь для вершины, ближайшей к текущей. >>799819 Именно так. Очередь с приоритетами нужна для того, чтобы элемент с наибольшим или наименьшим приоритетом извлекать за O(1).
>>799822 >На каждой итерации выбираешь ближайшую вершину Почему ближайшую? А не, например, дальнюю. Или посередине. Или первую. Ты тупо пересказываешь алгоритм, а я спросил, почему он выглядит именно так, а не иначе.
>Именно так. Очередь с приоритетами нужна для того, чтобы элемент с наибольшим или наименьшим приоритетом извлекать за O(1). Бля, ну залезь и почитай, заебал. O(1) - это время лучшей реализации такой очереди, но саму очередь определяют 2 операции: доступ к минимальному элементу и вставка. Вполне можно придумать ситуацию, когда константное время вставки элемента будет предпочтительнее, чем константное время изъятия. И в такой ситуации лучше будет применить очередь, основанную на массиве.
>>799827 >Почему ближайшую? А не, например, дальнюю. Или посередине. Или первую Потому что для каждого кратчайшего пути к какой-то вершине любая последовательность ребер в этом пути - тоже кратчайший путь. Поэтому выбираются ближайшие вершины, которые входят в кратчайший путь.
Завтра буду писать так, как у кормена: класть сразу все ребра в очередь и вынимать по одному. Помогите разобраться, что у меня здесь не так? https://ideone.com/pFZd13 Алгоритм работает верно: перед выполнением std::replace данные в distances правильные. std::replace должен заменить все значения INF = MAX_INT на -1, но почему-то алгоритм заменяет все подряд элементы на -1.
Вот скажите мне любители выделять и освобождать память почему Firefox не в состоянии работать больше суток без необходимости перезапуска? Каждый день у меня наступает момент, когда открыто 0 вкладок, а Firefox занимает в памяти 3 Гб. Каждый день наступает момент, когда Firefox перестает адекватно рендерить страницу. И наконец в этом году случилось совершенно небывалое — Firefox свалил шиндовс в кернел мод краш.
У разработчиков Firefox было 22 года (с момента выхода первого Netscape Navigator), чтобы научиться правильно выделять и освобождать память и они так и не научились это делать нормально. Самописный мемори аллокатор не помогает: https://hg.mozilla.org/mozilla-central/file/tip/memory/mozalloc/mozalloc.cpp
>>799858 Я не пони. Как ты сделал так, что возвращеный вектор стал содержать корректные значения? Я уже дифф сделал, но нихуя непонятно, почти ничего не изменилось же. Как так перед возвратом в векторе одни значения, а после возврата - другие?
>>800025 >Я не пони. Как ты сделал так, что возвращеный вектор стал содержать корректные значения? Я уже дифф сделал, но нихуя непонятно, почти ничего не изменилось же. Как так перед возвратом в векторе одни значения, а после возврата - другие? Лолка, у тебя там счетчик j в for, а используешь i
Изменения: 1. Для краткого определения очереди создал класс node с перегруженным оператором сравнения. Теперь очередь применяет упорядочивание элементов, зная, как их сравнивать. 2. Названия поле класса node более удобны, чем first и second. Не нужно вспоминать: в first вес ребра или номер конечной вершины. 3. Единообразие данных, используемых в представлении графа и его обработке: если в списках смежности хранятся пары (вершина, вес), то в очереди координаты пар расположены тоже в порядке (вершина, вес). 4. Небольшой недостаток использования класса node: надо помнить про порядок инициализации полей. 5. Для декомпозиции алгоритма Дейкстры все ребра сразу помещу в очередь. Это избавит от необходимости помещать ребро в очередь в коде релаксации, и процедуру релаксации можно написать отдельно. 6. Блок private выглядит как говно. Как научиться писать такие же красивые классы, как тут? https://rsdn.ru/forum/cpp/4243140.all
>>800078 И еще: >Graph::result Graph::result result = g.dijkstra(...) выглядит как говно, если не использовать auto. Стоит ли вообще использовать в этом классе typedef?
Какую функцию библиотеки можно использовать вместо этого велосипеда? Нужно вывести элементы вектора, начиная с первого и пропустив элемент с индексом start. Приходит в голову только что-то вроде фильтра или map, который получает предикат, не позволяющий добавить в возвращаемый список элемент с номером start.
>>800262 ты в лямбды не научился, не захватил значение `start`, нужно его в квадратных скобках написать, а если ты хочешь выкидывать элемент по его индексу, то сделай так: http://ideone.com/zHkkZL но так делать не очень хорошо, по сути
>>800268 Что бы о модулях сидеть пиздеть 10 лет и так ни к чему не придти. >>800268 >- локали >- ostream_iterator Что бы можно было сказать что "мы над чем-то там работаем, у нас нихуя не говёная стандартная библиотека" примерно ту же болезнь унаследовали авторы ди от авторов плюсов, лел
Сап ребят, такой вопросик. Можно ли на плюсах написать полноценное андроид приложение? Или все таки правда на плюсах писать онли тогда, когда нужен выигрыш в производительности. Очень лень учить Java только ради андроида. Сяп.
Именно гуй приложение разве что на Qt, вот только хуй знает, стоит ли свеч ебля с разными билдами под разные процессоры, большим размером от зависимостей и, самое главное, ебля с публикацией в маркете. >>800294 Не пиши хуйни, там вообще ничего нету для "полноценного приложения".
>>800268 С каких пор локали перестали быть нужными? ostream_iterator был еще в оригинальной реализации i/o потоков.
А вот про wchar_t я не знаю. Поясните мне. Насколько я понял, он нужен, если мы хотим хранить юникод, поддерживающий несколько языков одновременно. Какие альтернативы?
>>800316 >С каких пор локали перестали быть нужными? С таких, что для них ничего не гарантируется. Только наличие локали "С". Какой смысл вносить в стандарт entity, для которой не предоставляется никаких гарантий? Как писать переносимый код с этим?
> ostream_iterator был еще в оригинальной реализации i/o потоков. Кому нужен вывод с delimeter-ом после последнего элемента?
> Насколько я понял, он нужен, если мы хотим хранить юникод wchar_t хранит не юникод, а он достаточен для хранения некоего расширенного набора символов для данно платформы. Т.е. опять же, по сути ничего не гарантируется.
По мне так wchar_t и прочие локали только сбивают с толку. С ними невозможно написать переносимый код, хотя кажется, что для переносимости они добавлялись.
>>800325 >Кому нужен вывод с delimeter-ом после последнего элемента? Да не ебу, просто нельзя говорить, что эту хуйню запилили вместо модулей. Я вообще этой поеботой из итераторов и алгоритмов почти никогда не пользуюсь. Нахуй на каждый чих они зоделали функций, я не ебу.
Пишу в истерике, выручай, анон! Пишу тебе прямиком из двухтысячных! Не компилитсо, однако, если поставить "::MY_RESULT"(намекая на глобальную область видимости?) то компилится. Алсо в моем времени компилился и без двойных двоеточий. Делал свои потуги под VS2015 Код тут: http://pastebin.com/x1N2tSub
>>800333 >>800336 >>800344 Продолжу вопрос этого хуя. Насколько сильно обфускаторы влияют на генерацию ассемблерного кода? Так можно обходить сигнатурные анализаторы?
>>800379 >На кой хуй вообще обфусцировать исходный код Я думаю этот все тот же дебил, что уже неделю спамит своим фейк.av. Вероятно его поделие после нескольких тредов в /b уже добавили в базы и теперь он ищет обфускатор.
Начал разбираться в QT. Не знаю, есть ли тут соответствующий тред, так что вкатываюсь сюда. 1. Что такое макрос Q_OBJECT, как он работает, и зачем нужны свойства Q_PROPERTY, если они работают как геттеры и сеттеры, которые и так делаются public? 2. Почему это говно не компилится? http://pastebin.com/jnH961E3 Ошибки: In function Test: undefined reference to 'vtable for Test' In function ~Test: undefined reference to 'vtable for Test'
>>800396 После изменения Test test; на Test tst(): Test tst(); tst.setProperty("readOnly", true);
Ошибка: request for member 'setProperty' in 'tst', which is of non-class type 'Test()'
Что тут не так? Из-за отсутствия скобок программа не компилировалась, я так понимаю, потому, что компилятор Qt не поддерживает 11 стандарт, в котором конструктор преобразования с аргументом по умолчанию может работать как дефолтный конструктор.
>>800396 >QT Мамке своей это скажи, капслоковый мудель. >Q_OBJECT Открой и посмотри. Добавляет соответствующий для Qt контент в класс. > Q_PROPERTY А вот хуй знает, но для них что-то генерирует мок-компилятор.
Ненавижу qt т.к. кресты не тот язык на котором можно писать гуи и сделал он для великих дел, а не кодинга мышью. А софтвар дефлоперы самые менее опущенные из всех зашкварных программистов. Раньше десктоп был на дэлфи и дэлфидаунов за программистов не считали. Потом появился дотнет и сишарп. Они почему-то перестали считаться зашквареными, но десктоп остался работой для тупых. Кресты не для тупых. Qt не для крестов.
>>800396 Пиздец. Оказывается, все дело в том, что QT ссу в рот капсохейтеру заставляет определять классы в хедерах. Если класс определен в файле имплементации, все это почему-то не будет компилироваться.
>>798022 (OP) Посоветуйте, как можно код улучшить. Мне кажется, я хуево написал. Это задачка из Страуструпа. По задумке вводятся 2 числа и один символ. Числа потом выводятся, а если символ равен |, то консоль закрывается. Хотелось бы, чтобы третий символ не обязательно было вводить, а еще лучше, чтобы | можно было вместо одного из чисел ввести и ввод прекратился бы. Конкретно непонятно, как проверить тип данных, которые поступают из cin. http://pastebin.com/e5JAXf8h
>>800538 Я там отдельно функцию вынес - sqr. Суть в том, что в цикле идёт обращение к этой функции, в которой если - square = 1, то прибавляется 1 - если != 1, то умножается на самого себя Только я не пойму почему не работает.
>>800622 >Ты путаешь ум и задротство Сказал петушок, не приводя определения "ума". Когда спорят, например, ученые, они сначала договариваются о терминах, чтобы каждый понимал, о чем точно они спорят. Вот поэтому ты петушок. И все крестухи такие же петушки
>>800496 Лямбда-исчисление != нумералам Черча. Это все равно что сказать, что раз кресты полны, то числовые литералы тоже. >>800491 Ну ты словарь-то открой, должно полегчать.
>>800636 Определения "петушка", "ученых" и "определения" в студию, маня. Не, ну серьезно, я, конечно, понимаю, что маневрирование помогает психологически, когда нет аргументов, но мы же твои приемы насквозь видим, лучше бы занялся чем-нибудь полезным и не нервничал лишний раз.
Анон, дай совет. Хочу сохранить и проанализировать большой объем данных. Я тут небольшой рассчет накидал, нужны какие-то технические рекомендации.
Условно разделим этот список данных на юниты, каждый из которых состоит от 2 (минимально необходимое) до 4 (оптимальное). Соответственно очень грубо посчитал примерное количество символов в строке и пришел к выводу, что там будет где-то 80 байт, но досыпал ещё чуток. Если один юнит этого списка весит 150 байт, предположив, что это усредненное значение, а количество юнитов будет около 100000000, то передать нужно будет 15000000000 байт информации. Если предположить, что скорость передачи данных будет около 20 Mbps, то на один юнит будет уходить по 0.0572205 ms. За один запрос, который, надеюсь, будет проходить за 0.5 секунды мы можем вытащить до 6000 юнитов. Передать 6000 юнитов, как мы посчитали выше, займет 343.323 ms. Другими словами, 1000 ms - 343 ms - 500 ms = 157 ms.
А сюда ещё надо добавить выгрузку данных в базу, учесть провисание сети многое другое. Теоретически можно повысить пропускную способность в два раза, что сэкономит ещё ~150 ms, однако обработка массива данных должна уложиться в 200 ms. базу данных хочу Clickhouse использовать, ибо разработчики заявляют нихуевый такой перформанс.
Что такое обработка? Приходит огромный массив от нескольких кб до нескольких мб. Около 7-8 полей, которые нужно распарсить (JSON), конвертировать в csv формат и записать на диск. (все поля не нужны)
Концептуально я пока думаю работать так: Накапливать в ОЗУ большой объем данных, сохранять в csv файл, сжимать его архиватором и передавать в базу, где доступ к данным можно уже будет в риалтайме получать. Однако насколько какой-нибудь List/Array/etc эффективен для этого? Как организовать многопоточность в таком случае? И опять же, сохранять файлы на диск. Если есть SSD и сохранять по 50-100 mb, то не должно же сильно сказаться на производительности?
Другой вопрос на каком языке это все писать. В спешке писал на Java, ибо там все из карбоки, но использовал другую схему. Request -> обработка -> передача в очередь -> обработка -> сохранение данных. Однако скорость дохуя медленная. Обработка одного блока данных из 4 тысяч юнитов занимала порядка 3.7 секунды, что бесконечно много для такой операции. Можно устранять избыточность запросов к БД, создать адекватное соединение, но моя гипотеза такова, что я не смогу организовать работу серьезно быстрее.
Собственно, поэтому такие вопросы. - Многопоточность. Как оптимально организовать доступ к очереди? - Объем данных. Когда и как писать в файл? - Технологии. Может быть я не знаю что-то не знаю\не знаком, что позволит быстро переваривать большой объем данных и сохранять его. - Советы. Опять же, может быть я что-то воспринимаю не так или не совсем корректно понимаю. Рад выслушать все рекомендации.
>>800774 И я там кажется обосрался. Уже сам не знаю, как считать. Короче, у меня цель - один блок информации в секунду. От запроса к серверу до выгрузки в базу данных.
Один блок информации - от 1 до 6000 юнитов. Вариативность объема юнита от 4 байт до 70 байт (по оптимистичном расчету) и до 150 байт (по грустному расчету)
>>800779 >Один блок информации - от 1 до 6000 юнитов. Вариативность объема юнита от 4 байт до 70 байт (по оптимистичном расчету) и до 150 байт (по грустному расчету) К сожалению, вайпнул всю информацию. Могу лишь сказать, что в среднем на блок информации - 1000 юнитов. Да, долбоеб, не посчитал моду, например. Про объем юнита просто в голове прикинул. Могу ошибаться, так как у меня при сохранении некоторых юнитов в бд были сообщений о том, что varchar(256) превышен, что пиздец странно.
>>800771 >- Многопоточность. Как оптимально организовать доступ к очереди? Уверен это распространённая проблема и статьи экспертов помогут тебе больше чем советы с двача.
>>800788 Максимальный = 6000 юнитов на блок. Необработанный юнит может весить и по 1 кб, обработанный = 150 байт, так как извлекаются всего 2 поля. >>800790 Нет, у меня есть идея, как увеличить пропускную способность: сжать документ, найти канал шире. Узкое место скорее всего тут исключительно в обработке данных.
Насколько эффективно записывать блоки данных сначала в ОЗУ, а потом в файл?
>>800791 Схема такая: 1. Ответ->пишем в массив нужные поля->пишем в файл. 2. Сжимаем файлы 3. Загружаю их на сервер бд 4. Расжимаю 5. Пишу в БД.
>>800797 Зашел сюда чисто по старой памяти. Очень мило общались с Qt господином. Да и к тому же, анон частенько дает дельные советы.
>>800806 >Схема такая: У тебя 20мбит потока данных всего, нафиг ты хочешь сжимать, а, шакал? Я более чем уверен, что ты добьешься нужной производительности и на своем проекте на джаве, просто нужно запустить профайлер и посмотреть, где оно тормозит.
Торрент-клиенты и 500мбит могут выдавать, твоя задача очень скромненько смотрится на их фоне.
>>800816 Хорошо, а подход вообще целесообразен? Просто мой предыдущий подход, который мне казался наиболее оптимальным (запрос->обработать->очередь->отправить в бд->сохранить в бд) брал почти по 3.7 секунды на блок, что пиздец, как много.
>>800817 >запрос->обработать->очередь->отправить в бд->сохранить в бд А типа есть другие варианты, лол?
>брал почти по 3.7 секунды на блок Для таких проблем умные люди придумали профайлер. Может у тебя там менеджер памяти дохуя времени тратит, а все остальное ходит быстро. Тогда тебе просто нужно пул данных заебенить и все будет круто.
>>800823 >А типа есть другие варианты, лол? Очередь у меня была в облаке, поэтому может быть и задержка была - sqs. Второй обосрамс, что я видимо сделал крайне хуевый десериалайзер и сериалайзер json объектов. В итоге у меня один блок дважды парсится, бля. Наверное, в облако стоит тупо только обработанный юнит отправлять без обертки.
Мой же вариантименно генерить большой файл на стороне обработчика, а потом его сразу передавать на сервер, можно сжать.
Ладно, хотя бы теперь яснее стало, пока все описывал. Попробую на Java дописать, а там может и на крестах.
>>800829 >Очередь у меня была в облаке, поэтому может быть и задержка была - sqs Почему у тебя очередь и парсер на разных тачках? Ты планируешь масштабирование?
>>800857 Бля, ну профайлер - это заебись, но я бы хотел посмотреть, например, как себя ведут те или иные типы данных vector vs. x и т.д. Выгугли библиотеку, которая json парсит. Выбрал правильно, пока читал - понял, что говном занимаюсь. Если описать алгоритм подробнее. Запрос-ответ=>кидаю внутреннему воркеру в отдельный тред=>вытаскиваю данные=>упаковываю опять в нужный json=>отправляю в очередь=>ловлю в очереди=>распаковываю=>отправляю в бд. В общем, действительно прихожу к выводу, что нужно во-первых, оптимизировать парсер json, срать не в облако, а себе в ФС, а потом погонять профайлером.
Можно ли при помощи EFLAGS определить, что программа находится под эмулятором? Например, при помощи popfd изменяется значение какого-то привилегированного бита в EFLAGS, исключение обрабатывается эмулятором, но реальное значение в процессоре не изменяется. Тогда, читая EFLAGS и сравнивая его значение с ожидаемым, можно ли определить эмуляцию?
>>801202 Ты не того детектишь, петушок. Меня удивляет, вообще, что форс Куранина настолько серьезным. Думал сначала, что кто-то траллит или распространяет криптолокер, а там, похоже, действительно самодельный антивирус. Пацаны его даже реверсили.
https://ideone.com/1P9gsV - поясните, какое сделать условие в цикле, чтобы там еще 1 раз цикл прошёл после выполнения условия? Т.е. в задаче надо сделать так, чтобы последнее отображение было после 1000, а у меня получается до неё.
Взял короче книжку по крестам из шапки, которая референс от Страуструпа и которая устаревшая, и это, ебать там всё СЛОЖНА. Даже всякие жабы и шарпы полегче будут. Хотя это конечно с какой-то стороны хорошо, ибо программирование сугубо интеллектуальная деятельность вроде математики, САМОРАЗВИТИЯ СУПЕР ИИ ТЕХНОКРАТИЯ, но с другой стороны я не завидую вкатывающимся охранникам 27 лет из пятерочки, у них мозги взорвутся и они с большой вероятностью выкатятся обратно, кек.
>>801268 >Взял короче книжку по крестам из шапки, которая референс от Страуструпа и которая устаревшая, и это, ебать там всё Читал какого-то Стравуструпа в 15 лет, когда дрочил на вирасы и журнал ксакеп. Понимание какой-то сложности не представляло. Архитектура пека гораздо сложнее синтаксиса и библиотеки петушиных крестов.
>>801296 Хорошо. Больше не буду лезть с тупыми постами. И вдогонку. Сложность это то, что добавляет шарм и магию, возбуждает интерес. Простые вещи быстро приедаются.
>>801337 Сишники не могут дрочить на синтаксис, там ~50 ключевых слов. Если хочешь посмотреть на реальное задрачивание синтаксиса и неочевидной хуйни, ты на месте.
Ананасы, как в Qt сделать контейнер для других виджетов, который будет просто задавать фон? В deisgner-e использовал QFrame и ставил бэкграунд колор, но через код этот QFrame нихуя не показывается. Пикрелейтед - как я сделал в designer-e. Фрэйм с белым бэкграундом и парочкой label в нем.
Такое дело. Пишу вебсокет сервер. Handshake прошёл без проблем, данные с клиента тоже получаю норм, но при отправке на клиента строки AAA, конверчу её в 129:3:62:62:62, после чего добиваю пробелами \r\n\r\n и шлю в сокет. В ответ клиент сука рвёт соединение с ответом header invalid. Сижу над tcpdump-ом третий час. Rfc весь перелопатил Анон-погромист, выручай!
- Ну ты у меня такого рантайма получишь, суканах. Иди сюда! Собирайся! Собирайся в бинарник! Отвечай, говори. Все эти макросы, шаблоны у тебя в исходниках или в хэдерах. А эти ассерты... Эти ассерты!!! Все ваша блядская архитектура, проделки Александреску. Собирайся в бинарник, ибо стандартизация уже близко! Стандартизация.... Раскрывай пачки. Раскрывай пачки, сука! Смотри что я из-за тебя делаю, на компоновку!!! - Тебе нравятся мои методы, да? - Да! - А мне нравятся предупреждения! - Все кому нравятся предупреждения - говнокодеры!!! - Мне нравится, как они подсвечиваются... - СУКАНАХ!!! - Нравятся ошибки... - Суканах! - Нравится крашиться... - Суканах! - Я люблю костыли... - СУКАНАХ! - Я хочу костыль, я знаю, что тебе тоже нравится... Я знаю, что тебе нравится, что я хочу костыль... Тебе нравятся мои макросы, мне тоже. А еще мне нравятся нестандартизованные фичи... - Суканах! - Хочу неопределенное поведение! Я так хочу! - А я не хочу! - Хочешь почувствовать мои баги своим отладчиком? Хочешь? - Сучка, ты сводишь меня с ума, заткнись! Ты испорчена! Тебе нет места в памяти! - Я чувствую, тебе нравится... Ты сходишь с ума от моей скорости... - Я оптимизирую тебя. - Ты оптимизируешь меня? О как прекрасно, обожаю оптимизации, и тебе тоже понравится. Обожаю cstdlib, обожаю ассемблерные вставки... Вот это да! Этот профайлер, он сводит тебя с ума... Видишь, он тебе нравится, и я тебе нравлюсь. Перепиши меня, это же так естественно... Нравится? Ведь нравится. Быстрее... Быстрее! - Ты настоящая сука! - Собирай релизную версию... Вот молодец... - Что ты задумала?!! - Чудненько, а теперь посмотри на размер моей кучи... - Суканах!!! - Мне так нравится... - Нет, а если я добавлю памяти? Нет! Сука, блядь, дедлайн близок... Ах ты сука! Ты меня совращаешь, блядская сука, СУКА!!! Сука... Знаешь, что бывает с такими суками? Знаешь? Их запускают под valgrind'ом, запускают без отладки! - О да, виртуализуй мой процесс! Как это прекрасно... Трассировка это прекрасно, вдвигай поглубже, глубже, в библиотеки... - Получай, сука! Вот тебе за все хорошее! Нравится, сука? Вот тебе статический анализ! Я отправляю коммит!!! - Пора бы... - Смотри, сука! Иди сюда... Смотри! Смотри, что ты наделала! Это ты виновата...
Поясните, вот я как бы почти решил задачку: https://ideone.com/a7Ze4y НО, если я ввожу большие числа, например 1000000, то там начинается бесконечное непонятно что - пикрил. Я правильно понял что это из-за того, что int имеет ограничение на размер? Если так - как его обойти, если не так, что я не так сделал? С маленькими значениями работает ок.
Сап крестаны, вообщем припекло. В универе были лабы, которые я с переменным успехом мог выполнить, а сейчас лето, решил что-нибудь написать и понял, что той базы, что мне дали нихуя не хватает, что я не могу нихуя годного написать, что мне делать? Профа у меня нихуя не прогерская, т.е. на след курсе мы будем делать проги для подсчёта интегралов, а никаких новых курсов по проге не будет. Прочитать книгу с более глубоким подходом к изучению и опять сосницкого сделать? Что мне делать?
>>801959 Я не он, но я хочу писать игры. >>801925-кун Сначала доизучаю книгу страуструпа, а дальше будут смотреть в сторону дума первого. Хочу сделать что-то типа своего дума с открытым миром, рпг и т.д. с такой графикой.
>>801962 игры делаются так: 1. пишется движок. там определяется физика, хуйня с графикой разная, ну и т.п. Нужны знания с++(на чем-нибудь другом напишешь или напишешь, но хуево - твое говно будет лагать), тригонометрии, как выводить графику и еще там чето я хз. 2. на самом движке создается игра. тут все уже намного легче, потому что почти никаких знаний и не надо.
если тебя интересует первое, то просто выучи синтаксис, а потом почитай что-нибудь специализированное. там и про оптимизацию и про матчасть должно быть. если второе, то просто выучи синтаксис.
Анон, очень странный таск. В общем, нужно посчитать как можно быстрее количество строк в файле (должно быть не более 1 048 576 строчек).
Но погоди отправлять меня в учебник по С++. Суть в том, что я не знаю, как это сделать эффективнее. В целом задача стоит так: Объединить огромное количество файлов, каждый из которых может состоять из 0-6000 строк в файлы по 1 048 576.
Как бы самое очевидное - нужно тупо создавать новый файл, при достижении 1 048 576 строк сохранять его и проходить так по всем файлам. Другой вопрос, что найти в каждом файле "\n" дохуя долгая задача, как мне кажется. Какие есть варианты решения? Пока что я вижу только такио решение: 1. Создать вектор 2. Открыть первый файл 3. Записывать в вектор все строки. 4. При достижении i = 1048576 сохраняем вектор в файл, возвращаемся к пункту 2.
Так, посоны, короче. Есть Visual Studio 2013, с++11 стандарт уже вышел, но в чем соль, в MSVC 2013 я заметил, что не работают: перемещающие копирование и присваивание по-умолчанию constexpr Это пиздец...
>>802022 Строка где-то от 70 до 150 байт занимает. А ты, если я правильно понял, предлагаешь создать массив из 1048576 элементов? Плюс ещё данные терять бы не хотелось.
Скачал MinGW отсюдова http://sourceforge.net/projects/mingw вроде установил. Добавил в PATH путь до /MinGW/bin Теперь вопрос. Как добавить возможность компилировать c++11? Если писать так g++ main.cpp, то ругается на синтаксис c++11, если писать так g++ -std=c++11 main.cpp то ругается еще больше. Как быть?
Хочу научиться тестировать свои алгоритмы, но не знаю, с чего начать. Нагуглил какие-то юнит-тесты, но, по-моему, это какая-то хуйня. Во всех примерах этих тестов, которые я видел, просто сравнивается результат вызова функции с ожидаемым значением. Но что, если алгоритм слишком сложный, и возможных входных данных и результатов овер 9000? Так, как показано в статьях, протестировать все эти случаи невозможно.
>>802316 Все верно. Алгоритмы с бесконечным кол-вом входящих данных нельзя потестить. Да и не надо. Нужно тестить общий случай (1 - 2 кейса) и граничные.
Т.е. если ты тестируешь арифметическое сложение, то тупо делать так:
Господа, вопрос по синтаксису. Читаю Страуструпа "Программирование принципы и практика в с++" И встретил пару моментов, которые я понять не могу. Будьте дбобры объясните.
string iname = "test"; ifstrean ist(iname); //В книге синтаксис прямой инициализации был такой ist{iname} в MSVC2010 не работает ist.exceptions(ist.exceptions()|ios_base::badbit);
Полез смотреть на cplusplus/reference там void exceptions(std::ios_base::iostate except); Вроде как exceptions() принимает параметр iostate except. И устанавливает значение iostate goodbit, badbit, failbit или eofbit. Но что в этом примере ist.exceptions(ist.exceptions()|ios_base::badbit); вернет второй ist.exceptions() который передается как параметр в функцию? Символ | это побитовое или?
И еще запись такого вида впервые встречаю. vector<Point> points; for (int p : points){некое действие}; что происходит в for (int p : points), потому, что всегда встречал : в списках инициализации сущностей классов пример class Foo { public: Foo(int i, int j = 0) : m_i(i), m_j(j){} private: int m_i, m_j; };
>>802680 ist{iname} - это новый вид инициализации в c++11 ist.exceptions(), очевидно, вернет текущую маску, а | ios_base::badbit добавил badbit. | - это побитовое или, да. С помощью & и | легко ставить флаги в одно число, а не заводить несколько булинов.
for (int p : points){некое действие}; - это новый вид циклов, введенный в c++11. Удобен для итерирования всякого рода контейнеров (массивов / stl-контейнеров).
>>802754 http://www.cplusplus.com/reference/list/list/erase/ >Return value >An iterator pointing to the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.
>>802760 В книге написано, что инвалидируются все итераторы и ссылки на элементы, следующие после удаляемых, а ты мне про return value втираешь. Страшилки из книги не воспроизводятся.
>>802763 http://www.cplusplus.com/reference/list/list/erase/ >Iterator validity >Iterators, pointers and references referring to elements removed by the function are invalidated. All other iterators, pointers and references keep their validity.
ВОПРОС НА МИЛЛИОН Хочу стать супер оптимизатором, смотреть, что за ассемблерный код там сгенерировался, использовать ассемблерные вставки и прочее. Но ассемблер я почти не знаю. Было дело как-то давно в универе, но я абсолютно ен помню ничего. Собственно, вопрос: Что мне почитать про ассемблер? Что мне нужно знать про архитектуры процессоров(под разные архитектуры - разные языки же)? Что мне нужно знать, касательно С++?
>>802816 Тебе нужно научится писать на плюсах (а не учить ассемблер) и оптимизировать в первую очередь алгоритмы – вот и 95% производительности в любом софте.
>>802730 >2013 >какой сейчас год Ты дурак или прикидываешься, няша? Ну открой шапку, там есть ссылка на прекрасную последнюю VS 2015, в которой половина проблем старых версий давно решена.
В чем разница между итераторами контейнеров vector и list, из-за которой мой код сегфолтится, если сравнивать элементы вектора на четность таким образом: if (*it % 2 == 0)? Если убрать == 0, но оставить приведение по модулю, то код компилируется и запускается.
>>802886 С ним все в порядке. erase() возвращает указатель на следующий элемент за удаляемым. После удаления последнего итератор указывает туда же, куда и end(), но потом увеличивается в цикле и вылезает out of range.
>>802888 Смотри, когда ты присваиваешь it = u.erase(it), то it указывает на следующий элемент. Далее, значение it инкрементируется и проверяется условие it != u.end(). Если коротко, то при удалении элемента, кратного двум, ты пропускаешь следующий. Т.к. последнее число у тебя кратно двум 10, то при его удалении it становится равным u.end(). Но дальше у тебя it инкрементируется и получается что, out of range.
Почему работает с if (*it % 2)? А оно тоже не работает! Оно будет удалять только нечётные элементы (и оно точно также перепрыгивает через одно при удалении).
Ананасы, есть один проект в Qt. Допустим, что там в перспективе очень много ...window.cpp и .h файлов. Еще там есть .h файлы с классами, которые нужно закидывать в вектор и считывать из него из раличных ...window.cpp файлов по мере надобности. Я этот вектор объявил в этом же .h файле с помощью extern, а в самом первом .cpp файле в самом верху просто определил. Это нормальная практика? Какие подводные камни?
Есть такая функция: void foo(vector<int> v, int a){ for_each(v.begin(),v.end(),[a](int b){cout << (b<a);}); }
Как сделать то же самое без лямбда-выражения? То есть передать в for_each предикат с 1 параметром, но при этом с еще одной переменной "извне". И функторы тоже нельзя использовать.
>>802816 Ни разу не пытаюсь критиковать желание, но хотелось бы узнать у анона - вообще актуально ли в 2016 использовать ассемблерные вставки? Всегда казалось, что компилятор почти во всех случаях генерит крайне годный код. Не выйдет ли так, что оптимизация ручками будет либо в ноль, либо слишком маленький прирост или вовсе тормоза?
>>803576 1) Открой, например, исходники любого видеокодека – куча ассемблерного кода. И так во всех проектах где нужно делать что-то за 0.02 вместо 0.05. Или можешь посмотреть как пишутся всякие алгоритмы компрессии; 2) Будешь неаккуратен – словишь как раз таки регрессию производительности, т.к. сама вставка и всё что с ней связано оптимизироваться не будет (поэтому кстати куски которые нужно написать на асме пишут на нём полностью, а не вставкой с парой инструкций), а так же есть куча платформозависимой хуиты и хуиты в разных компиляторах (в стандарте прописана только необходимость наличия вставок, остальное не оговаривается от слова совсем).
>>803688 Он ищет минимум среди элементов от (i+1)-го до n-го. Предполагается, что выполняется инвариант цикла, состоящий в том, что элементы до i-го включительно минимальны и отсортированы. Но у меня почему-то так не работает.
>>803709 Веб как-то не впечатил( Я полгода в вузе учил си, потом плюсы ещё столько же. Ща шароюбюсь по гиту, исправляя баги в kdeшных программах(легкие). Вот и хочу узнать возмут ли меня куда-нибудь джуном или надо что-то подучить.
>>803730 Нет, баги -это новые фичи или некритичные недоделки, которые висят в вишлисте на сайте кде и касаются уже функционала программ. Но это уход в сторону от вопроса. Так что должен уметь джун?
>>803743 Писать рабочий код, не слишком выбивающийся из принятых в коллективе конвенций. Простые истины типа code complete надо. Виртуальные деструкторы надо. Анальные пляски на мутирующих шаблонах не надо, если только это не проект специально для создания какой-нибудь уберлибы. Оптимальность надо на примитивном уровне типа отсутствия дублирования данных, экспоненциальных алгоритмов и подобных непотребств, умение дрочить ассемблер не надо, но приветствуется в эмбеддеде.
Обучаемость. Уметь быстро нагуглить и понять то, чего не знаешь. Знание либ и фреймворков, которые используются в проекте, желательно, но не так важно, ибо это все равно вопрос пары недель, если ты нормально схватываешь инфу.
Уметь читать любой код, даже написанный пьяным гуру метапрограммирования 10 лет назад. Чтение с гуглом считается, никого не волнует, что ты там помнишь, главное чтобы не нужно было отвлекать серьезных дядь на разъяснение кода тебе.
Знания по предметной области. В случае, когда задача общая, этот пункт пропускается, но даже не надейся найти вакансию с такими условиями, крудошлепства на крестах нет уже лет 15.
Первые три пункта всегда находятся именно в таком порядке друг относительно друга, по убыванию важности. Четвертый пункт может быть на любом месте, в зависимости от ситуации.
>>803826 Спасибо. Думаю, что пойду в ближайшее время что-то искать по работе. Пока не очень получается ориентироваться в классах больших проектов. То бишь мне должны примерно сказать где вносить правки. Это с опытом приходит?
В общем, посмотрел, что тут всем советуют писать калькулятор, а делать утром было нехуй. Кресты начинал учить ещё прошлым летом, но забросил нахуй из-за учёбы. Вот вполне работающий код с костылями:
>>804343 > вполне работающий код > #include "stdafx.h" > #include <conio.h> > #include <process.h> У меня твой "вполне работающий" код даже не скомпилируется. Уноси свой спермокод отсюда.
>>804348 #include "stdafx.h" - необходимая параша для компиляции в Visual Studio (в моей версии). #include <conio.h> и #include <process.h> для работы кода вообще нахуй не нужны, если ты об этом. Просто привычка совать это в любую парашу - мало ли, вдруг функционал пригодится.
>>798022 (OP) Иногда один С++ заебывает, хочу почитать для развития что-нибудь про алгоритмы и организацию самих железок. Есть что-нибудь для ньюфагов, но без воды?
Старый ОП, который
Насаждал к искусству жаркий пыл в сердцах,
Из Dерьма восстанет,
И прекрасен станет
Тред, в котором лабы пишут на крестах.
Шапку он наполнит,
Свой обет исполнит,
Вам на суд являя новые стихи;
Музы скальда живы,
Но в своих призывах
Будьте терпеливы, братья крестухи.
Старший брат:
Предыдущий:
TL;DR
Q: Я хочу тотчас вкатиться, а разбираться буду в процессе. Что я должен делать?
Q: Не уверен, что хочу изучать C++. Как мне пощупать его без лишней ебли?
A: Читаешь эту книжку, смотришь упражнения из нее и суешь в онлайн-компилятор. Сообщения компилятора об ошибках копипастишь в гугл, ответы на возникающие у тебя вопросы ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее.
Памятка ньюфагу
Небольшие фрагменты кода размещай в треде при помощи тега [code] и жабаскрипт-костыля. Для больших фрагментов используй внешние сервисы.
FAQ
Мотивация
Q: Почему стоит использовать именно C++?
A: Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три:
C++ действительно быстрый язык — вместе с C, его прародителем, они с большим отрывом уделывают по скорости все остальные языки высокого уровня. Код на C++, как правило, медленнее аналогичного кода на C приблизительно на 0-20% а в ряде случаев C++ оказывается даже быстрее, причем замедление появляется только при использовании высокоуровневых конструкций (в C++ ты никогда не платишь за то, чего не используешь). Таким образом, если тебе требуется высокопроизводительный код, C++ станет отличным выбором.
C++, являясь одним из наиболее выразительных и мощных языков, позволяет использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментов
простреливания ногирешения задачи. Как следствие, используя C++, ты можешь не думать о том, как обойти искусственные ограничения языка, а беспрепятственно выбрать наиболее подходящие к ситуации средства.C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Q: Но он же давно устарел!
A: Современный C++ весьма далек от языка, которым он был в 1998 году. В настоящее время кресты живее всех живых, их развитие движется семимильными шагами, а новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими. К сожалению, из-за обилия некачественной литературы по С++, в которой игнорируются новые средства языка, бытует мнение о его "несовременности".
Q: Сейчас все пишут на %languagename, а кресты сосут у него!
A: Нужно понимать, что используемый язык должен соответствовать поставленной задаче. Никому не придет в голову писать на C++ скрипты или веб-фронтенд хотя это вполне возможно, но лишь немногие языки могут соперничать с ним по разнообразию решаемых задач.
Q: Хуле тут так сложно? Я открыл учебник, там какой-то ад!
A: Попробуй учебники, изданные после 2011 года, в которых рассматриваются возможности новых стандартов (C++11 и C++14). Эти фичи не только добавили выразительности, но и серьезно упростили жизнь разработчиков. Теперь программировать на C++ стало проще, чем когда-либо! Это не отменяет необходимости прочитать несколько серьезных книжек, чтобы написать на нем что-то годное. Тем не менее, да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Именно высокий порог вхождения повышает твою ценность как специалиста, не позволяя нанять вместо тебя индуса за еду. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
Литература
Q: Окей, я решил вкатиться. Какие же книги мне читать?
A: Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
Для нюфань
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется:
Кроме того, есть еще пара старых добрых учебников для ньюфагов. Часть информации в них устарела, но многие считают, что это компенсируется их большей, по сравнению с современными учебниками, понятностью:
Best practices
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все:
Проектирование
Следует пролистать все перед переходом от лаб к написанию настоящего софта.
Последний пункт есть квинтэссенция ГИБКОСТИ, поэтому стоит прочитать его в любом случае, чтобы охуеть от того, как можно делать:
Ахтунг!
Предыдущие два раздела дополняют, а не заменяют классические книги о лучших практиках разработки без привязки к конкретному языку (Макконнелл, Uncle Bob, GoF).
Справочники
Наиболее детальные описания языка. Удобно использовать как референс, читать от корки до корки не обязательно:
Кроме того, на ангельском доступны стандарты C++11, C++14, а также последняя версия черновика стандарта C++17.
Тонкости языка
Книги для тех, кто возлюбил кресты всей душой и желает углубиться в детали:
Отдельные аспекты
Читать по необходимости:
и других фич последних стандартов
для разработки многопоточных приложений
остальным частям стандартной библиотеки
язык программирования, чтобы ты мог
программировать, пока программируешь"
в ужас даже исходники boost::MPL
на C++. Для его чтения не нужно знать
мертвые языки, в отличие от этого вашего Кнута
https://goo.gl/yDuQgG (часть 5)
Другие обучающие материалы
Q: Я не умею читать.
A: Можешь посмотреть какой-нибудь онлайн-курс: раз, два, три
Q: Не люблю, когда льют воду. Хочу коротких материалов по существу.
A: Вот тебе блоги, факи, референсы и всякое такое:
Софт и библиотеки
Q: Я готов начать погроммировать! Куда мне писать код?
A: На этапе написания хэллоуворлдов можно не ебаться с установкой софта, а использовать онлайн-компиляторы: раз, два, три, четыре. Для работы над более серьезными вещами удобнее всего установить какую-нибудь IDE. Ниже приведены несколько хороших вариантов:
https://goo.gl/WIPW9L (ангельская версия)
"sudo aptitude install codelite codelite-plugins"
для установки под *nix
Здесь ты можешь найти все остальные существующие IDE, если ни одна из вышеперечисленных тебе не приглянулась.
Разумеется, установка IDE вовсе не обязательна. Ты можешь использовать текстовый редактор в связке с каким-нибудь компилятором, выбросить мышку, отрастить бороду и примкнуть к Церкви Святого Столлмана. Но лучше тогда сразу отправляйся в тред сишников, если не хочешь быть обоссанным другими сектантами за использование б-гомерзкого C++.
Q: Не буду я все делать сам! Подавайте сюда софт, который все сделает за меня и подотрет мне жопу!
A: Без проблем:
Также не стоит забывать о том, что правильные посоны экономят свое время и нервы, используя мегагодные git и cmake во всех проектах.
Q: Мне надоело писать велосипеды, какие у вас тут популярные либы?
Q: Нужно зделать %монструозная_хуйня_нейм, но я обосрался от одной мысли о написании ее с нуля, что же делать?
A: Гляди сюда:
boost
Бесспорно, это самый популярный набор C++-библиотек. Не будет лукавством сказать, что C++ во многом обязан популярностью именно ему. Воистину всеобъемлющий, boost способен удовлетворить твои самые скотские фантазии. В нем есть практически все - от математических функций до сетевых компонент, от инструментов тестирования до динамических типов. Функции для работы с твоей мамашей там тоже есть. Разумеется, все это швабодное и работает на любых платформах. И да, boost является своеобразным инкубатором хороших библиотек, поэтому наиболее удачные из них с большой вероятностью можно будет увидеть после принятия очередного стандарта уже как часть стандартной библиотеки.
Недостатком boost можно считать его размер - более 300 мегабайт. Большинство компонент boost не являются независимыми, и попытка использовать один единственный контейнер обернется фактическим подключением 2/3 всего присутствующего в комплекте. Таким образом, если boost не будет использоваться на полную, лучше юзать другие, более специализированные библиотеки.
Литература:
Qt
Существует швабодный кроссплатформенный фреймворк-надмножество C++ под названием Qt. Он содержит довольно большое количество компонент (для работы с сетью, базами данных, для юнит-тестирования и др.), но киллер-фичей и основным полем его применения являются возможности по разработке графических интерфейсов. Qt сам по себе, как расширение языка, предоставляет для этого более удобные средства, чем обычные библиотеки, а использование специализированных IDE наподобие Qt Creator позволяет в буквальном смысле собирать интерфейсы мышкой, а код писать только по существу.
Тем не менее, использование Qt нельзя однозначно назвать хорошей практикой. Во многом это уже не C++, а другой язык, со своими концепциями и паттернами. Qt-код требует дополнительного препроцессинга при помощи встроенных в Qt утилит (т.н. метаобъектная компиляция), поэтому не получится просто подключить Qt как обычную библиотеку и использовать свой любимый компилятор без дополнительного софта. Нельзя сказать, что это существенное препятствие, но есть мнение, что использование Qt нарушает дух C++, раздувает машинный код и порождает макак-любителей кодогенерации.
В настоящее время основные версии Qt - 4.8 и 5.х, полной обратной совместимости между ними нет как в пистоне, ага.
Литература:
https://goo.gl/toUDWc (исходники примеров)
https://goo.gl/qpkZFm (книга) +
https://goo.gl/LIIECh (исходники примеров)
Другие хорошие библиотеки
Несколько специализированных библиотек для часто встречающихся задач. Все — маленькие, быстрые и простые в освоении:
И еще куча библиотек на любой вкус.
Q: Я прочитал все вышеперечисленное, теперь я гуру! Что дальше?
A: Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
Предыдущие треды на архиваче
Старые ненумерованные треды
Отдельные Qt-треды