Покуда Вождь печально наблюдал За буйством грязных байтоебов в треде, Я к ним вошел и с горечью вскричал:
"Глупцы, ужель ваш разум стал столь беден? Вы погибаете, к скорости стремясь, Погрязшие навек в шаблонном бреде!"
И самый гадкий мне в ответ, смеясь: "Винишь ли ты меня за то веселье, Что я даю уму, с constexpr резвясь?
Мой код не служит вашим низким целям: Он должен извращенностью блистать, Чтоб все от метафункций охуели,
Быть зеркалом моих эмоций, блядь, Понятным лишь тем трюкачам бывалым, Что могут из гвоздей избу собрать...
Да проще, блядь, набить тебе ебало".
TL;DR Читаешь https://goo.gl/kVaela , делаешь примеры и суешь в http://ideone.com , ошибки копипастишь в гугл, непонятное ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее. И прочитай FAQ, расположенный ниже, в нем много полезного.
Унаследованная памятка:
Вопросу по синтаксису идут на хуй. Лабы идут на хуй. "Как мне сделать Х на чистых крестах без библиотек" идут на хуй. Все идут на хуй. Хейтер сосет члены на пару со своей мамашей.
Q:Почему стоит использовать именно C++? A: Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три: + C++ действительно быстрый - по скорости они вместе с C с большим отрывом уделывают любой другой язык. Замедление относительно C находится в районе 0-20% а в ряде случаев C++ оказывается даже быстрее, причем проявляется только при использовании высокоуровневых конструкций (в крестах ты никогда не платишь за то, чего не используешь). + C++ один из наиболее выразительных и мощных языков, позволяющий использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментов простреливания ноги решения задачи. + C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Q:Но он же давно устарел! A: Современный C++ весьма далек от языка, которым он был в 1998 году. В настоящее время кресты живее всех живых, их развитие движется семимильными шагами, а новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими. К сожалению, из-за обилия некачественной литературы по крестам, в которой игнорируются новые средства языка, бытует мнение о его "несовременности".
Q:Сейчас все пишут на %languagename, а кресты сосут у него! A: Нужно понимать, что используемый язык должен соответствовать поставленной задаче. Никому не придет в голову писать на C++ скрипты или веб-фронтенд, но лишь немногие языки могут соперничать с ним по разнообразию решаемых задач.
Q:Окей, я решил вкатиться. Какие же книги мне читать? A: Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
Для нюфань: Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется. Стэнли Липпман, Жози Лажойе и Барбара Му - Язык программирования C++ (2014) - https://goo.gl/kVaela Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2011) - https://goo.gl/nAFUXa
Учимся не писать говнокод: Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все. Скотт Мейерс - Эффективное использование C++ (2005) - https://goo.gl/wsDXGz Скотт Мейерс - Наиболее эффективное использование C++ (1996) - https://goo.gl/tHa0tO Скотт Мейерс - Effective Modern C++ (на ангельском) (2015) - https://goo.gl/uImH0J Скотт Мейерс - Эффективное использование STL (2002) - https://goo.gl/QtS8Dc Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ (2005) - https://goo.gl/Cpk4YR
Тонкости языка (для гурманов): Андрей Александреску - Современное проектирование на C++ (2002) - https://goo.gl/e1V5BC Герб Саттер - Решение сложных задач на C++ (2002) - https://goo.gl/iWaa6S Герб Саттер - Новые сложные задачи на C++ (2004) - https://goo.gl/4nn512
Также для легкого чтения подойдет книжка c историей создания C++: Бьерн Страуструп - Дизайн и эволюция C++ (1994) - https://goo.gl/FqbPwo
Отдельные аспекты: Читать по необходимости. Энтони Уильямс - Параллельное программирование на C++ в действии (2012) - https://goo.gl/qJfBkD Николаи Джоссатис - C++. Стандартная библиотека (2012) - https://goo.gl/PEyiMH Дэвид Вандевурд, Николаи Джоссатис - Шаблоны C++. Справочник разработчика (2003) - https://goo.gl/0M4NpG Роберт Седжвик - Фундаментальные алгоритмы на C++ (2001) - https://goo.gl/4jwxSl (части 1-4), https://goo.gl/yDuQgG (часть 5)
Q:Хуле тут так сложно? Я открыл учебник, там какой-то ад! A: Попробуй учебники, изданные после 2011 года. Фичи последних стандартов не только добавили выразительности, но и серьезно упростили жизнь разработчиков. Теперь программировать на C++ стало проще, чем когда-либо! Это не отменяет необходимости прочитать несколько серьезных книжек, чтобы написать на нем что-то годное. Тем не менее, да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
Q:Ты охуел? В этих книгах по тысяче страниц! Хочу коротких статей. A: Вот тебе блоги, факи, референсы и всякое такое:
Q:Я готов начать погроммировать! Куда мне писать код? A: Под шиндошс удобно использовать IDE Microsoft™ Visual Studio®. Базовую версию (2015 Community) можно бесплатно скачать отсюда: https://goo.gl/qgAAc6 (русская версия) или https://goo.gl/WIPW9L (ангельская версия). Чтобы начать писать код, нужно запустить Visual Studio, кликнуть "Файл - Создать - Проект - Пустой проект", после создания кликнуть слева правой кнопкой мыши по пункту "Файлы исходного кода", выбрать "Добавить - Создать элемент - Файл C++". Свои хэллоуворлды писать в этот файл, в дальнейшем можно добавить другие файлы и хедеры. Чтобы скомпилировать и запустить проект, нужно нажать "Сборка - Собрать решение", а затем "Отладка - Запуск без отладки".
Под *nix, как правило, уже предустановлен компилятор gcc (если нет, используй sudo aptitude install gcc), так что достаточно сохранить хэллоуворлд, набранный в текстовом редакторе, и выполнить g++ helloworld.cpp и ./a.out. Но удобнее установить какую-нибудь IDE, например, Code::Blocks (sudo aptitude install codeblocks) и работать в ней.
Еще у нас есть IDE, призванная похоронить Visual Studio пока не особо получается. Она стоит денег, но можно украсть почти не протухшую версию на торрентах или получить бесплатную лицензию по скану студбилета, если ты студент. Удобные свистелки и перделки присутствуют. Тормоза и баги присутствуют. Кросплатформенность присутствует - https://www.jetbrains.com/clion
Можно также не устанавливать ничего, а запускать свои хэллоуворлды на http://ideone.com, выбрав в левом нижнем углу язык C++14.
Q:Не буду я все делать сам! Подавайте сюда софт, который все сделает за меня и подотрет мне жопу! A: Без проблем:
Q:Мне надоело писать велосипеды, какие у вас тут популярные либы? Q:Нужно зделать %монструозная_хуйня_нейм, но я обосрался от одной мысли о написании ее с нуля, что же делать? A: Гляди сюда:
boost
Бесспорно, это самый популярный набор C++-библиотек. Не будет лукавством сказать, что C++ во многом обязан популярностью именно ему. Воистину всеобъемлющий, boost способен удовлетворить твои самые скотские фантазии. В нем есть практически все - от математических функций до сетевых компонент, от инструментов тестирования до динамических типов. Функции для работы с твоей мамашей там тоже есть. Разумеется, все это швабодное и работает на любых платформах. И да, boost является своеобразным инкубатором хороших библиотек, поэтому наиболее удачные из них с большой вероятностью можно будет увидеть после принятия очередного стандарта уже как часть стандартной библиотеки.
Недостатком boost можно считать его размер - более 300 мегабайт. Большинство компонент boost не являются независимыми, и попытка использовать один единственный контейнер обернется фактическим подключением 2/3 всего присутствующего в комплекте. Таким образом, если boost не будет использоваться на полную, лучше юзать другие, более специализированные библиотеки.
Литература: Ариндам Мукерджи - Learning Boost C++ Libraries (на ангельском) (2015) - https://goo.gl/b0gPN1
Qt
Существует швабодный кроссплатформенный фреймворк-надмножество C++ под названием Qt. Он содержит довольно большое количество компонент (для работы с сетью, базами данных, для юнит-тестирования и др.), но киллер-фичей и основным полем его применения являются возможности по разработке графических интерфейсов. Qt сам по себе, как расширение языка, предоставляет для этого более удобные средства, чем обычные библиотеки, а использование специализированных IDE наподобие Qt Creator позволяет в буквальном смысле собирать интерфейсы мышкой, а код писать только по существу.
Тем не менее, использование Qt нельзя однозначно назвать хорошей практикой. Во многом это уже не C++, а другой язык, со своими концепциями и паттернами. Qt-код требует дополнительного препроцессинга при помощи встроенных в Qt утилит (т.н. метаобъектная компиляция), поэтому не получится просто подключить Qt как обычную библиотеку и использовать свой любимый компилятор без дополнительного софта. Нельзя сказать, что это существенное препятствие, но есть мнение, что использование Qt нарушает дух C++, раздувает машинный код и порождает макак-любителей кодогенерации.
В настоящее время основные версии Qt - 4.8 и 5.х, полной обратной совместимости между ними нет как в пистоне, ага.
Несколько специализированных библиотек для часто встречающихся задач. Все маленькие, быстрые и простые в освоении: libcurl - сишная библиотека для работы с сетью (существует также curlpp - крестовая обертка для нее, но использовать ее не стоит, ибо разработка заброшена еще в 2009 году) - http://curl.haxx.se SFML - работа с графикой и аудио - http://www.sfml-dev.org FLTK - графические интерфейсы - http://fltk.org
Есть хеш-таблица, которая содержит пары ключ-значение. Таблица моделирует электронного продавца кусков мяса ("All pieces are numbered from 0 to N-1 in order of weight increase"). Когда покупатель выбирает один кусок, из хранилища в контейнер подгружается еще один кусок наибольшего веса. Как сделать обновление контейнера? Думаю, я зря выбрал для контейнера хеш-таблицу (хотел немного ускорить выбор кусков покупателем), т.к. слишком долго искать максимум по номерам в хеш-таблице. Стоит использовать priority_queue?
>т.к. слишком долго искать максимум по номерам в хеш-таблице Имею в виду, что если в контейнере уже есть куски с некоторыми номерами, то новый кусок должен иметь следующий номер в порядке возрастания.
>>590830 >Now the customer can simply come and press the button, and the seller will select the meat piece automatically. The pieces are stored in a special container inside the seller. Different pieces have different weights (all weights are distinct). There are N pieces of meat in the container То есть хеш-таблица была бы идеальна, потому что выбирать надо ее произвольный элемент по ключу. Очередь с приоритетом такого не позволит.
>>590839 Хранилище (warehouse) это какой-то из массивов - загружаешь в него числа, потом сортируешь. Потом с конца по очереди вытаскиваешь, тоесть просто индекс "конца" массива, читаешь число, индекс декрементируешь. С контейнером (conteiner) сложнее, но ничто с ключами очевидно не подходит - после каждого изъятия куска из контейнера, номера нескольких кусков могут изменится (так как они сдвигаются чтобы поддерживать порядок) - следовательно нужно менять ключи, а это не вариант. Можно сделать на массиве и сдвигать элементы при удалении/вставке, но есть более хитрожопые и эффективные варианты, например https://en.wikipedia.org/wiki/Skip_list
>>590861 Ну а как обновлять контейнер-то после изъятия каждого куска? Ты описал почти тот же алгоритм, что и у меня. Почему контейнер - очередь с приоритетами? Допустим, он упорядочен по номерам кусков и содержит 50 кусков. То есть на вершине лежит номер 50. А я выбираю номер 39. Как мне контейнер его вернет?
>>590857 >skip list Ой, это говнецо у нас было на лекциях, и тогда же сказали, что такая структура трудно реализуется, имеет плохую расширяемость и почти нигде не применяется.
>>590869 Ну это понятно, но больше нихуя нормального не вспоминается. У массива добавление/удаление за линию, поиск по индексу константа. У очереди с приоритетами добавление/удаление логарифм, но поиск по индексу линия. А у indexable skiplist логарифм во всем.
>>591321 Чтобы создавать видимость работы, и думать, что ты сделал что-то полезное - задал вопрос по книге. Читать ее не обязательно, ты уже и так много сделал на сегодня, например, посрал в /зк/.
Поясните, почему вообще кто-то юзает массив массивов для представления 2д-массива вместо того, чтобы юзать обычный массив и обращаться через [i * ширину + j]? Не видел ни в каких учебниках такого, но ведь это неплохая практика.
>>591402 Ну ты же понимаешь что я могу скастовать указатель на первый элемени к указателю на массив да? http://ideone.com/u6jPmT Другое дело, что типа "динамический массив" в цп+ нет.
>>591364 Зависит от юзкейса. Чаще последний вариант лучше и производительнее. Но масштабируемый ли? Что если наша матрица - разреженная? Нужно смотреть частный случай.
>>591466 мне не понятно, что происходит в реализации кода. Структуре А, которая является базовой для структуры В, присваивается константный ссылка s, и возвращается эта структура, я правильно понимаю?
Знатоки особенностей языка и закоулков стандартов, подскажите плиз, нормально ли вместо Gdiplus::Pen pen(Gdiplus::Color(255, 0, 0)); писать auto& pen = Gdiplus::Pen(Gdiplus::Color(255, 0, 0)); Это всегда будет гарантированно то же самое или можно сгущёнку словить? Я сначала вообще сделал auto pen = Gdiplus::Pen(Gdiplus::Color(255, 0, 0)); а тут, оказывается, конструктор копирования будет. Теперь за анус переживаю.
Поясните, зачем нужна uniform initialization. Я вижу только одно практическое применение - создавать объекты без указания типа, например при возврате или передаче в функцию. Но я вот читаю "Prefer initializing using {}". Это что значит, я теперь конструкторы всегда должен вызывать с фигурными скобками, чтоб быть модным пацаном и не объявить случайно функцию?
>>591613 Суть в том, что списки инициализации неявно приводятся к типу с подходящим конструктором. Поэтому можно писать return {2,3} вместо return AbstractSingletonProxyFactoryYourMomma (2, 3), например. А раньше такое работало только для конструкторов с одним параметром.
>>591618 Ну это я понял. Просто думаю, может это еще где-то часто используют. Я вроде встречал это раньше в каких-то не совсем понятных местах. Сейчас, к сожалению, вспомнить и привести пример не могу.
>>591596 Бросок эксепшена довольно дорог, поэтому не нужно на них вешать какую-либо логику, только реально исключительные и редкие ситуации. На контроллерах и само существование эксепшенов может быть дорогим. Поэтому если пишешь либу, которая в теории может быть использована на кофеварках, не используй их тоже. А так они скорее добро.
>>591596 Эксепшоны плохо в любом языке без сборки мусора, кроме случая когда они выбрасываются перед неизбежной смертью процесса. Эффективное использование эксепшенов в таких языках требует серьезного понимания че ты творишь, иначе неизбежны утечки памяти, лишние вызовы конструкторов/деструкторов и т.д. Поэтому в коде который может использовать другой программист их желательно не использовать (если небыло договоренности), так как у другога человека может не быть желания пердолиться с исключениями, раскруткой стека и т.д. В своем личном коде их можно спокойно использовать, раз ты решил что тебе с ними удобней. В некоторых ситуациях они могут действительно сильно упростить жизнь наверное.
Пиздец, перекатился с sdl на sfml, поковырялся, а у меня простецкие игрушки внезапно сжирают по 100 мб RAM, в то время как с тем же sdl на тех же ресурсах уходило в разы меньше. Почитал — действительно затратная в плане памяти библиотека, да ещё и с интелловскими видеокартами встроенными проблем много. Короче, дохуя минусов. Если я трачу, например, 70 мб просто на бэкгроунд, залупленный из одной текстуры 50х50, то что будет дальше? Я так никакой 2d игры не сделаю.
Я в чём-то дебил? Очевидно, да, но что бы вы посоветовали? OpenGL слишком потный для меня.
>>591717 Не парится посоветовал бы и выбирать что больше нравится. Люди, блядь, уже на питонах говно пишут (новеллки по 300 мб в оперативке :)))))))), а ты мозга ебёшь.
>>591466 Ссылочный тип и ссылки это разные вещи? Синтаксис ссылочного типа это тип+&? В чём отличие между ссылками и ссылочным типом, кроме синтаксиса?
>>591727 Нет, я для тестов погонял простецкие игрули, а сделать планирую кое-что немного серьезнее, даже людей собрал четыре человека, включая меня.
Ну а так, мне в целом плюсы нравятся, да и я не спешу никуда, такие дела.
>>591734 Я для теста взял текстуру 50x50, заполнил ей область 800x600, то есть вывалил на экран 192 такие текстуры. Затем ещё одна текстура 50x50 и один анимированный объект из семи текстур.
Всё это говно резервирует 80 и жрет 50 мб сразу со старта. Да, это не проблема, это не много, но и игры ещё нет. Сейчас я засуну туда паки уже готовых тайлов, эффекты, уже нарисованных и анимированных персонажей, и что получится? Короче, мне страшно смотреть на такие огромные цифры.
Получаю 32/58. Я ничего не рендерю, просто загрузил две текстуры 50x50 px.
Добавляю к этому загрузку тайл сет для персонажа. Разрешение 252x168. Много, да, но там 21 кадр анимации.
Получаю 47/75 мб. Мне кажется, что это полный пиздец для приложения такого уровня, ведь персонаж на экране не один, объектов должно быть много, большинство из них с анимацией, что ведет к ещё большему количеству текстур. Я не хочу потом вывалиться нахуй со своими требованиями уровня "ребята, ставьте 8 гигов ram для 2D говна".
>>591751 Ты дурачок конченый, у тебя с математикой плохо, приходи через два годика. Это действительно полный пиздец, ты не имеешь никакого представления о работе с памятью.
>>591619 Ну, насколько я понял идею комитетчиков, они хотели сделать, чтобы ты мог просто писать всегда одинаково, не задумываясь о том, какие скобки выбрать. С () это невозможно из-за хуйни с объявлением функции, поэтому юзают {}. Другое дело, что полной универсальности там все же не вышло, про это еще Скотт пилил в своей статье, например.
Аноны, что читать чтобы стать вирмейкером? Какой C++ используется в низкоуровневом программировании? Как вкатиться в низкоуровневоее программирование через C++?
>>591909 >Аноны, что читать чтобы стать вирмейкером? Калашников, Крупник, Крис Касперски. Тот, кто не может написать вирус на асме, не напишет его и на C++. Когда осилишь Калашникова, кури PE формат.
сап, аноны хочу чтобы мне показывало все цифры в диапазоне от v1 до v2, а происходит нихуя, если я за while выношу std::cout<<v1, v2; то мне показывает лишь первую цифру. Помогите чтоли нюфане setlocale(LC_CTYPE, "rus"); int v1, v2; std::cout<<"Укажите первое число"; std::cin>>v1; std::cout<<"Укажите второе число"; std::cin>>v2; while (v1>=v2) { ++v1; std::cout<<v1, v2; } getch(); return 0;
>>591989 >>591986 тут кроме запятой еще какая-то хуйня с логикой - странное сравнение (что у тебя нижняя граница?) - странное приращение v2 (зачем? почему?)
>>590823 (OP) http://pastebin.com/6nVEQENt объясните пожалуйста что означает запись ((X)y) в 17 строке этого кода, и почему при выводе будет выводиться 21 , хотя переменная i объявлена как константная?
>>592050 Никакой. Разница может быть если ты сделаешь float input_var; std::cin >> input_var; input_var += и тут твои варианты. В таких местах вроде надо указывать, чтобы оно не привелось сначала к double, потом обратно во float. Еще постфиксный f полезен, когда объявлено auto
>>592116 у кастится к типу X. Изначально у имеет тип Y и при вызове метода выводится 2, потом у кастится к Х и при вызове метода выводится 1, так как вызывается метод класса Х а не Y.
Поясните за QML. Есть ли вообще смысл использовать технологию QtQuick если не используешь нестандартные элементы и замысловатую анимацию в гуе? Среди плюсов QtQuick могу выделить лишь то, что в qtдизайнере можно рисовать разные state, это, кстати, очень круто. Среди минусов — Меню бар надо ручками вписывать (или я чего не понял), webview и тд. руками засовывать. Qt designer под QML каким-то недоделанным выглядит.
>>592050 Конкретно в твоем случае разницы нет, но в некоторых других случаях способ записи может повлиять, например на выбор перегрузки функции, или там шаблона http://ideone.com/6mGXCj Литерал из одних цифр без любых других символов (типа 0) считается типа int, литерал из точки и цифр типа double. У всех остальных там свои обозначения - у float в конце f, шестнадцетеричные литералы начинаются на 0x и т.п.
>>592143 На мой взгляд, это дело вкуса. На десктопе лучше традиционные Qt Widgets, на мобильных/встроенных (не десктопе, в общем) лучше QML. Ну и да, если хочешь сделать не нативный вид - то QML удобнее.
>>592000 Художник, парень_работающий_со_звуком и ещё один программист несколько получше меня. Ну а на мне гейм дизайн в основном, ибо кодер с меня такой себе. В любом случае, буду вникать.
Есть вот эта строчка кода. Игнорируйте k - x и i - y, допустим, что там ноль. off_x и off_y у меня были unsigned int, ибо я знал, что они всегда будут положительными. Это каким-то образом мешает мне вычитать их из других значений?
Я просто охуел, долго не мог найти проблему в коде, у меня ряд спрайтов не рисовался вообще. Сделал off_x и off_y знаковыми — всё стало нормально. По идее, допустим, off_x равен 10, а k - x = 0, в итоге из нуля вычитается 12 и функции передается результат -12.
Это что получается, если из signed вычесть unsigned, то результат будет unsigned?
>>592572 Не рвись. Думал, что нормально описал. Раз нет, сейчас исправлюсь.
k и i - переменные для итераций цикла. x и y - начальные значения для k и i в этих циклах. Циклы вложенные, у меня проблема была именно с первыми итерациями, а в первых итерациях k - x и i - y будет давать ноль.
Поэтому мой вопрос упрощается до этого: sprite.setPosition((0 - off_x, 0 - off_y);
То есть для первых итераций я получаю координаты элементов путем вычитания unsigned оффсета из нуля.
>>592568 >>592574 Короче, если сделать так: unsigned int x = 12; А затем в функцию, принимающую флоат, передать (0 - x), то функция получит пикрелейтед, а если же x у нас signed, то функция получит -12.
Вопрос: Может ли конструктор унаследованного класса применять инициализаторы для какого-то своего поля? То-есть, есть класс А, есть класс B, который наследуется от A. В классе B есть поле: bool is_child; Могу я создать конструктор: B() : is_child(false) {}
>>592950 Вообще пушка. Если надо пояснить, зачем нужен метод/класс или как его использовать - в хедере. Если надо пояснить, почему так реализовано, то в исходнике рядом с кодом.
Комментарии нужны только для тех вещей, которые не говорят сами за себя или не очевидны.
>>592970 >инклудят его в конец .h файла В смысле? Получится цикличная хрень какая-то. Например, есть класс Point. Хочу сделать несколько inline функций для этого класса, типа plus(p1, p2), minus(p1,p2) и так далее. Если делать в другом файле, то получится, что мне придётся в point.inl файле делать инклуд point.h и в файле point.h делать инклуд point.inl файла.
>>592975 Ну просто во всяких IDE есть, например, подсказки. Откуда они читаются? Из хедера или из соурс-файла? Да и вообще, есть какая-то "традиция", наверняка.
Аноны, а как в Си плюсах с мешами и булевыми операциями? Мне надо сделать динамическое разрушение брони, с помощью prefacture map, си плюсы имеют библиотеку на это?
Есть у меня директории include для .hpp и src для .cpp то бишь .. ── include ── src
У меня уже очень много файлов и там, и там. Я могу в принципе выделить в отдельные субдиректории определенные классы? Например, я делаю компонентную систему, логично ли будет сделать так: ── include ──── {хидеры } ──── System ────── { хидеры систем } ──── Component ────── { хидеры компонентов } ── src ──── ──── System ────── .... ──── Component ────── ...
Анончик, смотри какая проблема. Учу значит C++, и вот какая проблема - я учу тупо чтобы учить, т.е. понятия классов, наследования, stl итд итп. Т.е. как учебник, просто зубрю по сути. А вот как это потом применять на практике уже и не знаю. В общем что посоветуете, дабы выйти из такого тупика, няши? Может расскажете как вы учили? Что нужно учить, чтобы можно было бы применять это на повседневной практике?
Как и было предсказано Гербом, сегодня ночью вышел Update 1 для VS 2015, в который, помимо кучи других плюшек, входит полноценная поддержка gcc и clang, включая IntelliSense и все возможности отладки. Отныне можно пилить кросплатформенный софт, не отрывая руку от мышки, без какой-либо ебли с ssh-пробросами на виртуалку и прочего дерьма. Ну а гнутые выблядки со своими бомжесредами наконец окончательно перестанут вынимать хуи студиобояр из своих ртов.
Здарова, мужики, читаю Страуструпа уже какой месяц (с перерывами на другую литературу офк) и дошел до графики, где поясняются основы. И назрел такой вопрос, там в качестве примера используется FLTK библиотека и я не хочу её накатывать, то есть нахуй она нужна, если можно попрактиковаться с какой-нибудь более сложной и используемой (не как учебная). Подскажите в общем.
>>593295 Сейчас подрочил clang'ом простейшие хэллоуворлды с потоками, багов пока замечено не было. Размер релизной версии получается на пару байтов больше, чем у родного компилятора. Отладка работает идеально, как на родном, включая все фичи с графиками производительности, отображением параллельных стеков и всем остальным. Я кончаю просто от этого апдейта, посоны.
ДОПОЛНИТЕ FAQ В ШАПКЕ ОТВЕТОМ НА СЛЕДУЮЩИЙ ВОПРОС: Анончик, смотри какая проблема. Учу значит C++, и вот какая проблема - я учу тупо чтобы учить, т.е. понятия классов, наследования, stl итд итп. Т.е. как учебник, просто зубрю по сути. А вот как это потом применять на практике уже и не знаю. В общем что посоветуете, дабы выйти из такого тупика, няши? Может расскажете как вы учили? Что нужно учить, чтобы можно было бы применять это на повседневной практике?
>>593418 Так теперь tl;dr (кратко) и первая половина FAQ (развернуто) поясняют, как учить, не?
В игровой форме я нихуя не нашел. Было бы здорово, если бы анон дал ссылку на что-то вроде JavaRush, но только для крестов. Хотя я не уверен, что вообще существует в этом плане что-то, кроме сервисов с сотнями олимпиадных задач.
>>593438 Теперь всё в кучу. Что-то слишком развернуто, а что-то недостаточно детально описано. Надо бы и кратко и подробно. Без лишнего, но что бы всё влезло. Вопрос и ссылка на пастебин с ответом. Так что бы ответ можно было использовать отдельно от шапки. Я сам хотел составить что-то такое, но идей кроме читай книги пиши код нету. И занят для составления шапки. codewars вроде в кресты может и помогает в практике.
Есть один мамкин пограмист и это я, знаю js, немного знаю python, хочу расширить свои познания о программировании, стать крутым парнем, понимать архитектуру, паттерны, алгоритмы, нормальное ООП и другие вещи. Я уж молчу про работу с железом, памятью и прочими ништяками. Понятное дело в языках типа JS и вебе я от этого отрезан и даже слабо представляю себе реализацию полноценного бэкенда, да чего уж там, даже ООП не завезли! Отсюда и мое желание осилить нечто сложное и необузданное, такое как С++.
Был выбор между жабой и С++, жаба может дать работу есть вакансии, но я не хочу работать жабистом писать бэкенды и говнорешения для банков, я хочу писать для веба сейчас и возможно робототехники если осилю матан таки или мобилок потом.
И мой вопросик в том, правильный ли тут будет выбор С++? Смогу ли я осилить такие вещи как архитектурные решения, паттерны, нормальное ООП, работу с памятью и другие ништяки НЕ РАБОТАЯ на С++? Я имею ввиду, не работая за деньги, а читая тонны литературы, гугля и разрабатывая свои приложения? Сейчас работая на жс я уже заметил, все лучшие ребята на жс которых я знаю писали раньше на подобных языках и их понимание намного лучше моего, я чувствую себя дауном аутистом среди гениев.
Подскажите посаны, не хочу въебать кучу времени и сил в никуда, но хочу расширить свои знания.
>>593451 А, ты про модули. Хуй знает, я еще не пробовал. Но вообще я скептически отношусь к этой затее, ибо все равно основными убийцами быстрой компиляции являются шаблоны, а с ними модули не являются волшебной таблеткой, ничем не отличаясь от обычного подхода. А десять проходов парсера по нешаблонному хэдеру считать серьезной проблемой как-то стремно в 2015 году, лол.
>>586516 (OP) Аноны, нужно реализовать динамическое разрушение. Вдохновляюсь вот этой вот статьей, пишу все на крестах, можно ли там все сделать, как в этой статье? Это работа с мешами, библиотека для работы с мешами подойдет, да? И еще, матан знаю слабо очень, а тут что-то типа матрицы в статье. http://matthias-mueller-fischer.ch/publications/fractureSG2013.pdf
>>593482 Дык их и не ввели чтобы пробовать. Тем не менее, даже если конпеляцию шаблонного кода это не сильно разгонит, то хоть более менее человеческую структуру библиотечному коду придаст чтоле. Вообще надо запретить нахуй все эти импорты хуимпорты везде, кроме системных библиотек и излишне тяжёлого говна и наслаждаться открытым кодом
>>593483 Аноны, никто не знает? Если обычную библиотеку использовать и обычные булевы операции применять, то оно прокатит? Про алгоритм спавна спасибо автору статьи. Но есть ли на крестах такая библиотека? Сам я такое походу не напишу.
>>593498 ТЫ работать на нём хочешь или для себя выучить, но на роботу/собеседования не ходить и не зарабатывать? Без работы можно по книгам всю выучить.
>>593499 На гитхабе хотя бы: >language:java >We’ve found 1,517,595 repository results >language:js >We’ve found 1,764,471 repository results >language:c++ >We’ve found 465,676 repository results
Причём как минимум четверть из крестовых проектов - кирилообразныйгеймдев. Можешь ещё проследить частоту апанья этого треда и тредов мейнстримных языков (задачка тебе тренеровочная).
>>593507 Нихуя не понял. Я спрашивал сравнение статистики спроса/предложения новых джуниоров или тех что без опыта работы кадров на разных языков, а не количество проектов.
>>593496 Потому что Александреску, зная тонкости анальных плясок с шаблонами, смог обойти большинство граблей, на которые наткнулись разработчики крестов и их компиляторов давным-давно. Теперь сами кресты нельзя перепилить без нарушения обратной совместимости, а зделать новый язык можно, вот и сделали.
>>593506 Я работаю на жс, я хочу его выучить чтобы иметь представление как работают серьезные пацанские языки, которые применяют для серьезных штук серьезные дяди, где есть полноценные ООП, на которых можно изучать алгоритмы, понимать работу с железом и подобное. Ну и если буду в мобалй перекатываться под ios что эти знания мне помогут. Короче, хочу познать не скриптовую сторону программирования, где всё за тебя уже сделали дяди на тех же самых С++.
>>593514 Да. Тебе в С++, но можно и во что угодно. Не увидел вопроса и не понял почему ты выбрал кресты. Но можно учить что угодно. От архитектуры компьютера и VHDL, до администрирование линукса. Языке тоже любые подойду если только на js писал. От Lisp и Haskell до Fortran и Assembler. Кресты учить долго. Проще сначала Си, а потом и Objective-C/Swift если будешь в ios вкатываться.
>>593510 Прямая, блядь, зависимость. Если язык востребован - больше челиков пытаются пилить портфолио и делают/копипастят всевозможные опенсорс проекты.
>>593526 Блядь, заебало уже это говно. Потом у нас десять версий интеджеров лежит, 8 из которых устаревшие, а девятый НУ ВЫ ТАМ НЕ ИСПОЛЬЗУЙТЕ НАВЕРНОЕ ЛУЧШЕ ХОТЯ ХУЙ ЗНАЕТ.
>>593528 Откуда всю эту инфу взять, аноны? Посоветуйте литературу, чтобы понять о мешах/полигонах/фрактуринге И прочем? Чтобы суметь сделать разрушения, как в PhysX или Хавоке?
>>593529 МОЧЕРАТОР БЛЯДЬ! ИДИ БАНЬ УЖЕ ЭТОГО ЖИРНОГО ПИДОРА, ОН ОПЯТЬ ОБОСРАЛСЯ! ВНЕЗАПНО кол-во погромистов на каком либо языке зависит в первую очередь от спроса на рынке. Про кол-во джунов - требования к "джуну" плюсовику немного на другом уровне, относительно всевозможных жавадебилов.
Если в ламбде нужно передать значения из области видимости по ссылке, без копирования, две штуки, считается хорошим тоном их же и передать в capture (хуй знает как это дерьмо называется по-нашему), типа, [¶m1, ¶m2], либо обойтись [&]?
Аноны, как в сях используя windows.h просканировать файлы, которые лежат в папке с программой? Просто не хочется скармливать scandir полный путь, так как хотелось бы сделать программу более гибкой.
>>593922 >>593945 Спасибо, но уже не надо. Напишите вместо меня пожалуйста функцию которая принимает int и кладёт его в множество если такого элемента там ещё нет и возвращает true, а если нот там есть, то возвращает false.
Подскажите, какую книжку стоит прочесть. Имею пару лет практики в гейдеве на плюсах, до это литературу не читал, только документацию по интересующим аспектам. Сейчас хочу заполнить пробелы, сгладить свою линию познания языка, так сказать. Какая книга лучше подойдет?
>>594020 В том-то и дело, что я не обладаю никаким структурированным знанием. Это выливается в то, что в процессе решения каких-то задач я могу быть поставлен в тупик из-за неожиданной специфики тех или иных аспектов языка. В результате я теряю много времени на то, чтоб разобраться в проблеме, в то время как какие-то общие и простые знания могли бы помочь и вовсе избежать возникновения проблемы.
>>594021 Ясно, ты нихуя не знаешь. Читаешь https://goo.gl/kVaela , делаешь примеры и суешь в http://ideone.com , ошибки копипастишь в гугл, непонятное ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее. И прочитай FAQ, расположенный ниже, в нем много полезного.
>>594009 Заечем тролишь ньюфага? https://ideone.com/V29Gi5 >>594018 Ну, Страуструппа попробуй, иногда советуют после нормальной книги и небольшого опыта программирования его советуют, типа проникнутся идеологией. Не знаю насколько оправдано.
>>594026 Время (в секундах), которое потрачено на вставку элемента во множество. Если 0 - значит элемент не был вставлен, т.к. уже присутствует во множество, больше 0 - вставлен, т.к. отсутствовал.
Англобоги. Как по-русски сказать Template Argument Deduction. Интересует слово deduction, ведь оно значит "вычитание", но по смыслу тут скорее "вычисление" ближе
>>594079 Так переводится тут? Ну звучит логично, просто "определение" не видел значения такого. да, ограничился гугл.транслейтом включая все русские переводы, английское толкование и примеры
>>594113 Кстати, годный термин. Чего сразу не подумал, лол. Что за книга?
И такой вопрос. Навернул Мейерса "Эффективное использование С++". Следом хочу эффективное использование STL и потом Effective Modern C++. Так вот книгу по STL можно заменить чем-нить современным? Или она и сейчас годна? Мб вообще по диагонали прочитать с уделением внимания на эффективность и т.п.
Есть одна функция. Её нужно применять по очереди к каждому элементу массива. Внутри функции фор. Нужно делать только по одному шагу фора за вызов функции. То есть 1ый шаг к первому элементу массива и сохранить где-то промежуточный результат. Потом первый щаг ко второму элементу, потом к третьему. Далее второй шаг к первому, второй шаг ко второму. Понятно объяснил? Как такое сделать?
>>594189 Без подробностей трудно однозначно сказать. Но, если я правильно понял, ты как-то вывернул задачу на изнанку. Тому for, который у тебя в фукнции, там не место. for (int i = 0; ...; ++i) //цикл, который, по-твоему, в функции { for (auto item : array) // обход массива { func(i, item); // порядковый номер обхода массива передается как параметр } }
Суть, надеюсь, понятна. Если задача требуетс такого "вывернутого" подхода как в описании, описывай подробнее.
>>594232 иногда yield нужен, но не у это случае. в любом случае, если такой подход не подходит, пусть рассказывает откуда вообще такие странные требования взялись
>>594226 >>594229 >>594232 Вводится n чисел и надо узнать на квадрат какого числа делиться их произведение. Я искал делители каждого введёного числа и заносил их в множество. Был фор по всем n числам и вызывалась функция ищущая и запоминающая простые делители и она вылетала как только находила повторяющейся. А как только найдёт повтор, то вылетает, выводится ответ и программа закрывается. Это слишком долго поэтому нужно переделать так чтобы искать 1 делитель сразу у всех элементов массива по очереди. Функцию выворачивать не надо, а остальные советы я не понял. Проще заново переписать?
>>594242 > надо узнать на квадрат какого числа делиться их произведение Именно такое задание? Может на квадрат какого максимально возможного числа? Для твоей формулировки задания как ответ подходит число 1.
>>594253 Сделай так, сначала используя std::max_element найди максимальный, после этого найди все простые числа до корня четвёртой степени из него (решето Эратосфена), после этого с помощью std::transform получи диапазон квадратов этих простых, после этого вычисли произведение через const auto product = std::accumulate с нужным функтором. И в конце return std::any_of(squared_primes.begin(), squared_primes.end(), [product] (auto squared_prime) {return product % squared_prime == 0u;})
>>594270 Не, я тебе наврал. Твоя правда, ты не можешь их перемножить, переполнится.
Если бы была возможность перемножить, то если тебя интересует делимость на квадрат (она равносильна делимости на квадрат некоторого простого), то нету смысла искать лишние простые до квадратного корня, т..к их квадрат будет лишь больше. Но тут я опять плохо прочёл условие. До квадратного корня, ты же не то максимальное на делимость проверяешь, а произведение всех этих. Так что про корень 4й степени, я наврал так же. Извиняй
>>594264 Если любое то тогда попарно проверяешь НОД всех чисел, пока не найдешь любой НОД больше еденицы - его возвращаешь. Если все НОД еденица - возвращаешь еденицу. Перед этим проверяешь не является ли какой-то число квадратом - если да то возвращает корень из этого числа. Насчет быстроты не знаю, но скорее всего это будет быстрее чем любая факторизация.
>>594281 Так что тебе искать все простые числа до корня из максимального считанного. Далее проверять каждое считанное на делимости этих простых, а потом брать такие, которые вошли два раза.
>>594294 >искать все простые числа до корня из максимального считанного Максимум 3 миллиарда операций. Если параллельно простые делители искать, то последний тест проходит за 65 миллионов итераций.
>>594286 Не совсем понял решение, но выглядит просто. Потом ещё подумаю. Спасибо.
>>594286 Нихуя, такое решение не найдёт квадраты в составе одного множителя (когда множитель делится на квадрат простого, а остальные на него не делятся)
Недавно стал угарать по всяким модам и плагинам, которые пилятся для игр в том числе и для серверной части. (напр.: AMX Mod) А так же всякие скриптовые языки. Меня естественно не интересует их синтаксис или ещё какая-то хуйня, а хочу узнать как вот это вот все взаимодействует с ОС и непосредственно с самой игрой. Так вот аноны, есть ли какая-то общая инфа/литература по этой части? Или это все неофициально и придется выдирать чьи-то посты с форумов для поиска? В общем реквестирую любую информацию, которая помогла бы хоть чем-то.
>>594458 Наверное, да. Но только ли это? А как вообще проектируются все эти моды (не в две строки которые офк) или это делается исходя из опыта? Как взаимодействует с ОС/игрой? Столько вопросов, пиздец. Я так понимаю специализированную литературу не найдешь? >>594471 Поясни с чем я обосрался? Я в курсе, что в тырнете есть куча статей от васянов по модам и прочей хуйне, но там все разбросано и нет общей картины, а зачастую совсем не по теме.
>>594480 >Поясни с чем я обосрался? Я серьёзно. Интересно же. Просто за компанию спросил. А то всё в кучу в нете и хуй пойми с чего начать и что делать.
>>594483 Вот и я о чем, сижу-сижу, а статей много, думаю ну че за хуйня, пошел в крестотред к поцанам, захожу, а меня тут какой-то васян тролякает, ну а я че, ебать?
Аноны, надо отредактировать тонну больших( больше 1.4 гигабайта 1 файл) текстовых файлов и убрать лишние пробелы, как это можно сделать? Есть какие-то инструменты, которые позволяют работать с большими текстовыми файлами?
>>594286 Спасибо. НОД работает и быстро, но всего пару тестов прошло без проверки есть ли квадрат в самом числе. Как это проверить быстро? Выходит нужен код как тут >>594253 только без множества.
Вариант в параллельным поиском делителей проверил. Делает всё правильно, но долго. Как ускорить?
>>594471 Кстати это мне ответили на форчане. >Получить жир и найти сумасшедшего друга, который думает, что он является сумасшедший ученый носить поддельные халат, а затем помочь ему власти его микроволновая машину времени, чтобы сохранить Qt.
Поясните за дефрагментацию памяти. Я создал 3 массива. Они создались рядом. Центральный удалил. Потом создал между двумя оставшимися ещё 1 поменьше. И сохронил указатель на центральный элемент. Далее изменил его размер дак только в си можно? значит я пишу на си так что он не влезает между двумя массивами и он переехал в другое место. А указатель на центральный элемент не изменился? Как это посмотреть? Как в дебагере визуализировать память программы?
>>594836 Лучше перестраховаться. Попытка вызвать удаленный конструктор базового класса будет только для сгенерированных конструкторов производного. Если у производного будет пользовательский конструктор копирования, и ты явно не пропишешь, какой конструктор вызвать у родителя, то у родителя вызовется неудаленный дефолтный, и ты получишь долгие часы ебли, лол.
>>594957 Что через realloc, что автоматически при увеличении capacity std::vector - если память переехала, все указатели на нее испортились, ибо никто не станет отслеживать, что там на нее указывает. Так что твой указатель не изменится, но разыменовывать его уже будет нельзя.
В студии включаешь отладку и открываешь вкладку "Память". В gdb и lldb для просмотра памяти есть команда x, гугли.
>>594836 Если удалены функции копирования в базовом классе, то компилятор не сможет создать синтезируемые функции копирования в производном классе, но ты можешь сам определить эти функции в производном классе.
Теперь мой вопрос, как к стринге приапендить интовую пременную. да, блять, оказалось не так всё просто ток нормальным способом сам дошел до того, что инт ебашил в поток, а потом со стрингом пытался совокупить, вот только не помню вышло ли, но в любом случае, это мне не нравится, ваши советы.
>>595339 Нужен список простых чисел от 2 до корня от максимального числа. Потом по очереди берешь простые числа и проверяешь делится ли на это число несколько из введенных чисел, или какое-то число два раза. Если нашел возвращаешь. Пробывал такое?
>>595359 > от 2 до корня от максимального числа Их 50 миллионов. Я их искать долго буду, а потом ещё и делить. Плюс в память не влезут т.к. нужно 4 байта на число, а ограничения всего 131кб.
>>595362 Решетом Аткина же генерируй, плюс тебе не нужно же сразу все простые. Генеришь блоками пока не встретишь первое подходящее. Конечно может и он в секунду не влезет, но я хуй знает как проверить что в разложении числа есть два повторяющихся множителя, без разложения на множетели.
>>595293 В настройках комплекты там всякие, все легко и просто указывается
return из цикла в функцииАноним04/12/15 Птн 19:17:05#368№595757
Это очень нагло и приведет к утечке или сборщик мусора все сам правильно поймет? В программе есть функция, внутри нее цикл, которые прерывается не через break (ибо вложенный), а через return из функции. Возможно, цикл там с массивом или объектами что-нибудь делал.
И еще вопрос: какие есть дельные сайты вроде php.net, всеобъемлющие и желательно на русском? Нагуглил только cplusplus.com и cpp reference, но что-то я не понимаю даже, чем они отличаются, ну и там инглиш, да.
А, и еще один, да: что скажете об альтернативных средах разработки - Qt Creator, IDEA, вот это всё? Вроде поадекватнее лицензия, нет завязки на кококорпорации, кроссплатформа, да и весят-жрут меньше.
>>595758 Да, я немножко путаю терминологию, наверное. Сборщик - это тот, который неиспользуемые более динамически созданные (не в статической памяти) объекты подтирает, да?
>>595761 Да. Сборщик позволяет писать new и не париться писать delete. В С++ есть только RAII - автоматический вызов деструкторов у объектов, лежащих на стеке при потере области видимости. Это позволяет контролировать ресурсы.
>>595764 Хм. А разве в этих ваших кутях и прочих фоеймворках нет реализаций new со сборщиком (ну, точнее, автоматическим освобождением памяти после разрушения объекта)? Мне говорили, что есть.
>>595758 >В С++ нет сборщика мусора. Но ответ на твой вопрос - ничего течь не будет Можешь объяснить вкратце, почему так? Это во всех языках или только тут? Это действительно нормальная практика? Для меня дико немножко заставлять что-то делать компилятор, прерывая его в рандомном месте, это для меня примерно как goto.
>>595769 >Это во всех языках или только тут? В сишке можно накосячить, там нужно чистить все вручную, я написал ниже, как. В языках со сборкой мусора зависит от типа твоего ресурса. Память ты можешь не освобождать, сборщик подберет. Но открытый файл, сокет или мьютекс, к примеру, нужно закрыть, потому что сборщик мусора штука недетерменированная и твой мусорный объект, владеющий ресурсом, может вообще никогда не удалиться. В С++ нет разницы между ресурсами, будь то память или файл, или сокет, или мьютекс, по выходу из области видимости будет вызван деструктор, в деструктор можно поместить логику - очистить память у std::vector и std::unique_ptr, закрыть файл у std::ofstream, разлочить мьютекс и т. п.
>Для меня дико немножко заставлять что-то делать компилятор, прерывая его в рандомном месте, это для меня примерно как goto. Компилятор всего лишь генерирует машинный код, он поймет, что тебе нужно. Компилятор создаст в конце функции область, в которой он будет вызывать деструкторы, и в месте твоего return сделает goto в эту область. И это без исключений еще. Брошенное исключение вообще вызывает раскрутку освобождения ресурсов по стеку вызовов до тех пор, пока его не обработают. Явное использование goto в такой ситуации - это типичный паттерн в сишке, кстати.
>>595289 Разобрался с этим. Нужно было через unistaller доустановить компоненты и не париться. Новый вопрос возник: когда я создаю новый проект, он без проблем компилится с помощью доустановленного mingw, но как использовать добавленный kit (mingw) для старого проекта(созданного до установки mingw)?
>>595757 >что скажете об альтернативных средах разработки Мне вот как раз вчера захотелось удобной разработки под вендой сразу с тремя компиляторами, чтобы кроссплатформенность и все дела. Выше было, что после апдейта студия начала поддерживать что-то, кроме VC++, но пока эти плагины очень сырые, и разрабатывать что-то серьезное хуй получится.
Так вот, я стал искать альтернативную IDE, чтобы была легкой, поддерживала все компиляторы и по возможности была сравнимой по удобству со студией. И результаты поисков превзошли все мои ожидания - я нашел CodeLite. Она весит всего 100 с чем-то мегабайт, работает крайне шустро, а еще в ней в два клика прикручивается clang'овское API автодополнения, которое уделывает встроенное в Qt, Eclipse и NetBeans. Конечно, по удобству она все равно серьезно уступает VS и Clion, но швабодность и небольшой размер делают ее идеальным вариантом в качестве второй/учебной IDE. Люто рекомендую, в общем.
>>595768 >автоматическим освобождением памяти после разрушения объекта У тебя каша в голове. Память и так освобождается при разрушении, без специальных реализаций. Проблема в том, чтобы заставить объект автоматически разрушаться. Такие надстройки есть, но они убивают производительность, поэтому гораздо лучше использовать умные указатели.
>>595826 >Мне вот как раз вчера захотелось удобной разработки под вендой сразу с тремя компиляторами Нахуя тебе IDE для этого? Создаешь cmake проект, в нем генерируешь проект для visual studio ("cmake -G вижуал студио"), когда нужно протестить другие компиляторы, то просто из консольки (бат файла) компилируешь и тестируешь.
>>595810 Нет. RTTI - это именно возможность узнать "наиболее производный тип" объекта, имея указатель на тип одного из базовых. Это делается при помощи typeid или dynamic_cast, а просто указывать может что угодно на что угодно, даже без RTTI.
>>595837 Мне неудобно руками править CMakeList при каждом добавлении нового файла/изменении конфига. Я же сижу под студией, все делаю оттуда. Голый CMake удобен в случае, когда у тебя уже есть готовый проект, который нужно распространять между платформами, а в рамках самой разработки не оче хочется руками все править. Сейчас вот смотрю в сторону конвертора студийных проектов в CMake-формат, попробую прикрутить его на автоматический запуск при каждой сборке в студии.
>>595847 На самом деле это очень удобно. Потому что cmake отлично дружит с git, diff (там не убогий xml), можно легко на языке программирования делать логику типа препроцессинга и генерации доков. А студия предлагает ползать по менюшкам (pre-build, post-build), а потом втыкать в xml в системе контроля версий, при debug/release win32/win64 это превращается в боль. Лишние 10 секунд при добавлении нового файла тут вообще роли не играют, как будто ты файлы десятками создаешь за день.
>>595861 Не помню проблем с этим, давно с виндой не работал. Если они есть, на самом деле ты можешь добавить файл в студию по старинке, это же сгенерированные проекты, студия-то о cmake ничего не знает. Просто строчку в CMakeLists нужно будет тоже добавить. Но в любом случае плюшки перебивают минусы.
>>595931 Написать программу для определения надёжности функционирования объекта
Пусть известно, что объект может функционировать в нескольких режимах, а режим определяется значением одного определённого параметра. Известны границы изменения этого параметра для каждого режима. Для определения надёжности функционирования объекта были проведены его испытания при различных режимах, в которых определялись значение "режимного" параметра и продолжительность времени функционирования объекта. Задано требуемое время функционирования объекта. Для заданного времени требуется определить надёжность функционирования объекта для каждого режима работы, общую надёжность функционирования объекта и среднее время его функционирования. Пусть после проведённых испытаний мы наблюдали за функционированием ещё одного объекта. Объект прекратил функционировать до истечения заданного времени. Определить вероятность каждого режима функционирования для этого объекта. Данные испытаний записаны в файл, имеющий следующий вид: 1-я запись: требуемое время функционирования; 2-я запись: a1 a2 …ak - границы изменения параметра, определяющего режим (до a1 – первый режим, от a1 до a2 – второй, …, свыше ak – (k+1)-й режим); последующие записи: значение параметра продолжительность функционирования. В некоторых случаях при записи продолжительности функционирования мог произойти сбой (т.е. продолжительность функционирования может быть пропущена).
>>595938 > Для определения надёжности функционирования объекта были проведены его испытания при различных режимах, в которых определялись значение "режимного" параметра и продолжительность времени функционирования объекта. В конкретном режиме он функционирует константное время? Правильно понял?
Определить вероятность каждого режима функционирования для этого объекта. Данные испытаний записаны в файл, имеющий следующий вид: 1-я запись: требуемое время функционирования; 2-я запись: a1 a2 …ak - границы изменения параметра, определяющего режим (до a1 – первый режим, от a1 до a2 – второй, …, свыше ak – (k+1)-й режим); последующие записи: значение параметра продолжительность функционирования. В некоторых случаях при записи продолжительности функционирования мог произойти сбой (т.е. продолжительность функционирования может быть пропущена).
По сути у нас есть некоторая йоба, двигатель к примеру. Двигатель может работать на разных оборотах (разные режимы). При испытаниях мы берем кучу двигателей и запускаем их на разных оборотах. И видим, что 100 двигателей вышло из строя на 1000 оборотах (выход из строя - это когда он проработал меньше, чем время в первой строчке), 5 двигателей - на 10000 оборотах, 1 двигатель - на 100 оборотах. И далее нужно для каждого режима определить характеристики вероятности выхода из строя (мат ожидание, сигму и т. п.). Потом решить еще одну задачу - если он вышел из строя раньше времени, в каком режиме он был вероятнее всего. Задача на теорвер короче, и с нужной формулой она решится в 3 строчки.
>>595938 >объект Моторо >режим функционирования Мощность >параметр продолжительности функционирования Время которое может работать мотор при конкретной мощности не сломавшись.
Правильно понял? Можно продолжать дальше задачу переделывать?
>>595979 Да конкретика тебе не нужна. Тебе нужно применить формулу с числами типа P(выход из строя|режим), P(режим|выход из строя), P(режим), P(выход из строя), сами числа взять из таблички и проверить на тривиальных примерах.
ПРИМЕР 1. 40 % приборов собирается из высококачественных деталей, остальные - из деталей обычного качества. В первом случае надежность прибора (вероятность безотказной работы за время Т) равна 0,90, а если прибор собрали из обычных деталей, его надежность 0,60. Прибор в течении времени Т работал безотказно. Чему равна вероятность того, что он собран из высококачественных деталей? Решение. Возможны две гипотезы:H1 - прибор собран из высококачественных деталей; H2 - прибор собран из обычных деталей. Вероятность того, что прибор собран из высококачественных деталей равна Р(H1) =0,4 и из обычных - Р(H2) = 0,6 . Пусть А - событие, состоящее в том, что прибор безотказно работал в течение времени Т. Тогда вероятность того, что прибор безотказно проработавший в течение времени Т, был собран из высококачественных деталей равна Р(А/H1)= 0,9 и из обычных - Р(А/H2) = 0,6. По условию задачи прибор в течение времени Т работал безотказно. Нас интересует вероятность Р(H1/А ) , что этот прибор собран из высококачественных деталей. По формуле Байеса получаем: Р(H1/А) = Р(H1)×Р( А / H1 )/{Р(H1 )×Р(А / H1 ) + Р(H2 )×Р( А/ H2)}= = 0,4× 0,9 /( 0,4× 0,9 + 0,6× 0,6 ) = 0,5.
Вот в этой хуйне "качество" нужно заменить на "режим". Короче, я ненавижу теорвер и решать это не буду.
std::vector<int> vec = {1, 2, 3, 4, 5, 6 }; Выдает ошибку C99. stoi нет. Дохуя еще чего нет. Как, блядь, заставить конпелятор конпелять C++ 14? IDE Dev C++, TGM-GCC 4.9.2
>>596205 Так, туплю, не добавил команду для сборки. Другой вопрос. Почему я не могу указать размерность одномерного вектора при его определении в круглых или квадратных скобках, но для двухмерного должен указывать оба размера должен, причем именно в квадратных?
Блядь, да я ебал. Почему я могу использовать size() для одномерного вектора, но не могу для вектора, содержащемся внутри другого вектора? Или, если могу, то как? Сука, что ж так все запутанно-то?
Нахуя тебе это? Если тебе нужен класс "матрица", не используй вектор внутри вектора, используй специализированные библиотеки. Вектор хуево дружит с кэшем из-за большого количества указателей, он не обязан быть прямоугольным и т. д.
>>596208 Не, совсем не то. У меня есть вектор, содержащий строки. При объявлении его по типу std::vector<string> vec = {"abc","xyz"}; он объявляется, но не хочет объявляться, если я пишу vec(2) = {"abc","xyz"}; или vec[2] = {"abc","xyz"}; Но при этом если я создаю двухмерный вектор, в ячейках которого соержатся строки, мне нужно зачем-то писать vec[2][2] = { {"abc", "xyz"},{"cba", "zyx"} }; хотя компилятор мог бы точно так же и сам посчитать. И еще: size() работает для одномерного массива, но не работает для, например, vec[0], когда это двухмерный вектор и я не знаю, сколько в строчке столбцов.
>>596210 Я таких пока не знаю... Нахуя мне ОТДЕЛЬНЫЙ класс одномерных массивов, ОТДЕЛЬНЫЙ под многомерные, да еще и при наличии встроенных, лол? Задача-то на 150 строк. >v[0].size() Не работает.
>>596219 Блядь, ну это же бред. Мне нужен двухмерный массив, для которого я могу использовать индексацию по [] и функцию, узнавания размера всего массива (из скольких массивов состоит) и размера каждого из элементов (из скольки элементов состоит соответствующий вложенный массив). К слову, ->size() выдает вместо результата произвольную хуйню.
Как объявить статическую переменную внутри класса, установив ей определенное значение ВНУТРИ этого класса (не во внешнем коде)? Например, считать количество объектов.
>>596233 Ок, теперь size работает, а при попытке вывести элемент массива на экран сосу хуй: [Error] cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'
>>596236 > Например, массив сообщений об ошибках на разных языках. Зачем это хранить всю сразу? Дефолтно, ок, юзается английский. Если возникает какая-то ошибка, то возвращается её номер и проверяется какой язык установлен в программе, а затем выводится текст ошибки или в лог записывается.
>>596239 Ты путаешь объявление и определение. Объявить статическую переменную ты должен внутри класса, а вот определить ее - снаружи. Это сделано потому, что классы обычно определяются в хедере и инклудятся в множество объектных модулей, если бы можно определять статические переменные внутри класса, в каждом модуле были бы разные переменные. А сама статическая переменная должна быть одна. Поэтому объявить внутри, а вот определить - снаружи. http://ideone.com/Qne2sF
>>596241 Мне нужна переменная, на которую можно влиять только изнутри класса, из его объектов, но она должна быть одна для всех объектов класса (как пример - количество объектов). А такая статическая переменная не только извне задается, но она вообще паблик, мне такое не подходит. Как быть?
>>596245 Пытаюсь сделать у класса свойство static int id; Присвоить ему начальное значение - нельзя, после класса его определять не труъ, ибо придется делать public static int id; а моя задача - сделать переменную, доступную только изнутри объекто класса. Твой вариант посмотрел, окей, годно, только строка 11 - это все равно определение ВНЕ класса, другой программист может ее случайно переопределить и пиздец. Логика работы должна быть примерно как у поля id в sql.
>>596247 Другой программист может ее и в хедере переопределить, у него же такой же редактор, как у тебя. Строка 11 должна быть внутри .cpp файла, содержащего реализации методов класса. Это наоборот даже более безопасно, чем писать что-то в определении класса в хедере. Потому что исходники твоего скомпилированно объектного модуля ты давать не обязан, а вот хедер нужен.
>>596248 Хм, идейно. Если не трудно, распиши, какая вообще логика/идеология того, что совать в .h, а что в .cpp? Документацию, дружественные функции, пустые конструкторы или конструкторы копирования?
>>596247 > Присвоить ему начальное значение - нельзя, после класса его определять не труъ, ибо придется делать public static int id; Ну а зачем тебе ебаться с какой-то переменной. Сделай какой-нибудь простой класс отвечающий за инкремент и декремент значения.
>>596253 Логика такая. В С++ нет модулей. Вообще. Хедер - это по сути копипаста препроцессором текста из одного файла в другой.
Для компилятора С++ есть только .cpp файлы, которые он превращает в файлы .o, а линкер из них собирает уже исполняемый модуль.
Что туда пихать? Определения, о которых нужно знать снаружи, шаблоны (по этой причине почти весь буст - header-only), и функции, которые могут инлайниться.
>функции, которые могут инлайниться. Т.е. достаточно маленькие. Например, геттеры и сеттеры приватных пропертей, скорее всего нужно будет запихнуть в хедер, если, конечно, ты не используешь сокрытие реализации типа pimpl.
>>596255 Так еще раз, переменная одна внутри всего класса, похуй, где, я же не смогу этого самого класса только один экземпляр иметь для всех объектов класса, которые кто-то другой создавать и использовать может. Пример еще раз - айди, порядковый номер каждого объекта. >>596248 Но ведь эта строка МОЖЕТ быть и в другом месте, где сторонний программист захочет. >>596256 >шаблоны Эм, хм, почему? Если я делаю метод с шаблонами, я его реализацию должен держать в .h?
>>596258 >Так еще раз, переменная одна внутри всего класса, похуй, где, я же не смогу этого самого класса только один экземпляр иметь для всех объектов класса, которые кто-то другой создавать и использовать может. По сути ты сейчас делаешь синглтоноподобную сущность - шаришь состояние на всю программу. Это плохо, потому что в будущем может оказаться все, что угодно (гугли по singleton is antipattern). Заведи себе классы Yoba и YobaManager, передавай в конструктор Yoba указатель на YobaManager, и внутри YobaManager заведи свою переменную. Тогда обойдешься без синглтонов, при желании можешь иметь один глобальный manager на всю программу, а можешь все десять. http://ideone.com/yQbEj8 >Но ведь эта строка МОЖЕТ быть и в другом месте, где сторонний программист захочет. С++ не тот язык, где есть защита от криворуких индусов. Твой злоумышленник может и #define private public написать. >Эм, хм, почему? Если я делаю метод с шаблонами, я его реализацию должен держать в .h? Если ты хочешь, чтобы он вызывался снаружи, из других объектных файлов, да. >>596260 Можно в хедере объявить уже инициализированные шаблоны. https://msdn.microsoft.com/en-us/library/by56e477.aspx (zomg, MSDN), а сам код спрятать внутрь. Но пользователь твоей библиотеки не сможет объявлять новые специализации, только то, что ты предусмотрел.
>>596261 >>596262 >С++ не тот язык, где есть защита от криворуких индусов. Твой злоумышленник может и #define private public написать. Жестоко. И хуле делать? Шарп? Жаба? Питон?
Блядьблядьблядьблядь, СУКА! http://ideone.com/bMgx7U Если ввести не число, случается пиздец. isNaN юзать или что? Не исключение же бросать в программе laba2.cpp
Братия во крестах. Может мне кто пояснить одну вещь? Короче, такая ХУИТА, как "Хранилище". Вот у меня есть абстрактный объект Place (место). Есть джва класса-наследника, Flat(квартира) и House(дом). Есть это ебаное Storage. Мне надо туда уметь ебашить и Флет, и Хаус. И чтобы можно было удалять, добавлять, очищать, ну прочие кириллования. Вот я конкретно залип, у меня это сторейдж динамическое. Как мне научить туда программу добавлять необходимые объекты классов? Ну понятно, массив-"пустышка" из Place, куда забиваются указатели. Но как? Операция "=" у меня чет не работает. Может мне кто конструкцию в общих чертах обрисовать? Код нинада, просто хотя бы строчки с созданием такого массива/добавлением элементов.
>>596292 >Операция "=" у меня чет не работает Еще один даун, надеюшихся на то, что телепаты вернутся из отпуска. Код, блядь, показывай, пидарас ебаный.
>>596307 Вообще не понял. Ты имеешь в виду библиотеки? Нельзя, потому что цель - именно самому и научиться подобные вещи катать. >>596310 Пост прочитай внимательней, даун. Я прошу не окд мне править, а обрисовать структуру, как это реализовать. А не код писать. Хоть на псевдокоде.
>>596312 > Пост прочитай внимательней, даун. Я прошу не окд мне править, а обрисовать структуру, как это реализовать. А не код писать. Хоть на псевдокоде.
Тебе уже намекнули, что хранить в массиве надо указатель на абстрактный класс.
Хотя чо я распинаюсь, вести себя в интернете научись сначала. Тебя нормально попросили показать, что у тебя не выходит конкретно, поехавший.
>>596330 Я не просто так спросил код. Опытному человеку может показаться, что у него проблемы с гетерогенным вектором. Но на самом деле нет, у него проблемы с тем, что он велосипедит собственный вектор.
>>596328 Вот книги я и просил тоже. Спасибо, взял на заметку. >>596331 >>596330 >>596334 Ясно, я диб. После этого я смогу напрямую туда присваивать указатели?
Ну, аноны! Буфер не чистится! Я ему чисти-чисти, а он не чистится. cin.get(), cin.ignore(cin.rdbuf()->in_avail());, cin.clear(); - похуй, если ввести строку, его нечеловечески залагает, а если считывать посимвольно, он так и будет для каждого символа перепечатывать всю хуету.
http://ideone.com/bMgx7U Если ввести не число, случается пиздец. isNaN юзать или что? Не исключение же бросать в программе laba2.cpp
>>596388 И заодно объясните, почему я не могу определить вот такую функцию std::cin::clearStream { std::cin.clear(); std::cin.sync(); } Типа динамически низзя, только наследованием?
Эй, мужики, а посоветуйте книгу по ассемблеру. Я как-то месяца два-три назад читал Калашникова, но там пиздец как скучно. Есть какие-нибудь, где есть ебля с памятью и присутствуют ассемблерные вставки, чтобы на крестах можно было какую-нибудь хуйню наклепать?
>>596415 > просто захотел добавить метод классу динамически, что в этом преступного? Тогда нельзя будет провести статический анализ правильности вызовов методов. У с++ статическая система типов, следовательно типы должны быть определены статически.
В общем, хедеры Страуса с графикой не хотят компилиться по-хорошему, но сама библиотека FLTK работает отлично. Вопрос анону, читавшему Страуструпа, можно ли перепрыгнуть на пару (или одну?) главу вперед, где уже начинается работа с библиотекой FLTK. Или же прочитать все подряд, просто без выполнения заданий? На счет ошибок при компиляции я нагуглил и стало известно, что у него там какой-то хуйни наворочено, а править сам неизвестный мне код я не буду.
>>590823 (OP) Много гайдов прочитал, но так и не допёр. Как правильно распаковать и скомпилировать boost? Скачал я архив с официального сайта распаковал в папку c:\boost Затем через командную строку вызвал сначала bootstrap. bat затем набрал b2 toolset=msvc-12.0 variant=debug link=shared threading=multi runtime-link=shared address-model=64 stage
Всё верно сделал? Слишком быстро всё скомпилировалось, несмотря на то, что комп слабый. Из переменных пользователя исчезла запись BOOST_PATH = с:\boost\boost_1_59_0 (которую я сам внёс). Почему тогда QtCreator обнаруживает папку boost_1_59_0? (в инклюде после "boost/")
Чего интересного можно придумать с openCV? Захотелось разобраться с этой либой, параллельно делая что-то незатейливое на основе нее.
Машграф, отсечение невидимых треугольников и пиздец.Аноним06/12/15 Вск 08:48:39#529№596944
Анон, спасай меня пожалуйста. Пытаюсь делать прогу по машграфу, сурс - книжка древнего голландского пидора-Аммерала, нихуя не получается. Нарисовал кубик - окей. Нарисовал кубик из треугольников - окей. Пытаюсь сделать отсечение невидимых треугольников хотя бы для выпуклой фигуры (кубик) и ловлю бушлат, так как вместо невидимых, отсекается какая-то левая херня. Для каждого треугольника на экране имею мировые xyz каждой его точки, видовые xyz каждой точки (с учетом расположения камеры) и экранные xy каждой точки (с учетом удаления наблюдателя от плоскости экрана). Пытался считать через все типы координат C и D плоскости и сравнивать их с нулем - хуй, результат для них обоих один и тот же (что логично), но совсем не тот, что в книжке (что уже не очень). Помогайте. Может есть для такого случая готовый, вери изи алгоритм на 10 строчек? Или может посмотрите мой говнокод и исправите ошибку? (как-то стремно в нет выкладывать в открытую, лаба все-таки, потом еще препод приебется насчет уникальности) Ну или хоть дайте совет, как быть.
Как оценивается сложность алгоритма и вот это все. Я так понимаю в ВУЗах проходят на специальности, да? Читаю Страуса и он там затронул тему. Есть какая литература что ли по этому делу?
>>597124 Седжвик. А вообще тебе книги по алгоритмам, а не крестам надо. Тут даже вроде кидали новую книгу кармена на 200 с чем-то страниц. Книга говно, но в первых главах это поясняют. она на пике
>>597166 Спасибо, почитаю. >А вообще тебе книги по алгоритмам, а не крестам надо. Я не преследовал цель учить алгоритмы, пока что только синтаксис. Но раз на этой стадии Страуструп решил заговорить о сложности алгоритмов, то почему бы мне не порыть этот материал глубже.
>>597100 >>597100 Ты с ВМК? Расскажи что-нибудь про лабораторию компбютерной графики. Хотел пойти туда на магистратуру. >лаба говно Не знаю, но постоянно натыкаюсь на каких-нибудь успешных чуваков, работающих в нвидиа после всей этой движухи.
За буйством грязных байтоебов в треде,
Я к ним вошел и с горечью вскричал:
"Глупцы, ужель ваш разум стал столь беден?
Вы погибаете, к скорости стремясь,
Погрязшие навек в шаблонном бреде!"
И самый гадкий мне в ответ, смеясь:
"Винишь ли ты меня за то веселье,
Что я даю уму, с constexpr резвясь?
Мой код не служит вашим низким целям:
Он должен извращенностью блистать,
Чтоб все от метафункций охуели,
Быть зеркалом моих эмоций, блядь,
Понятным лишь тем трюкачам бывалым,
Что могут из гвоздей избу собрать...
Да проще, блядь, набить тебе ебало".
TL;DR Читаешь https://goo.gl/kVaela , делаешь примеры и суешь в http://ideone.com , ошибки копипастишь в гугл, непонятное ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее. И прочитай FAQ, расположенный ниже, в нем много полезного.
Унаследованная памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Старший брат:
Предыдущий:
FAQ:
Q: Почему стоит использовать именно C++?
A: Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три:
+ C++ действительно быстрый - по скорости они вместе с C с большим отрывом уделывают любой другой язык. Замедление относительно C находится в районе 0-20% а в ряде случаев C++ оказывается даже быстрее, причем проявляется только при использовании высокоуровневых конструкций (в крестах ты никогда не платишь за то, чего не используешь).
+ C++ один из наиболее выразительных и мощных языков, позволяющий использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментов простреливания ноги решения задачи.
+ C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Q: Но он же давно устарел!
A: Современный C++ весьма далек от языка, которым он был в 1998 году. В настоящее время кресты живее всех живых, их развитие движется семимильными шагами, а новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими. К сожалению, из-за обилия некачественной литературы по крестам, в которой игнорируются новые средства языка, бытует мнение о его "несовременности".
Q: Сейчас все пишут на %languagename, а кресты сосут у него!
A: Нужно понимать, что используемый язык должен соответствовать поставленной задаче. Никому не придет в голову писать на C++ скрипты или веб-фронтенд, но лишь немногие языки могут соперничать с ним по разнообразию решаемых задач.
Q: Окей, я решил вкатиться. Какие же книги мне читать?
A: Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
Для нюфань:
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется.
Стэнли Липпман, Жози Лажойе и Барбара Му - Язык программирования C++ (2014) - https://goo.gl/kVaela
Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u
Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2011) - https://goo.gl/nAFUXa
Герберт Шилдт - C++. Базовый курс (2010) - https://goo.gl/qMLAFl
Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004) - https://goo.gl/QvjR6x
Учимся не писать говнокод:
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все.
Скотт Мейерс - Эффективное использование C++ (2005) - https://goo.gl/wsDXGz
Скотт Мейерс - Наиболее эффективное использование C++ (1996) - https://goo.gl/tHa0tO
Скотт Мейерс - Effective Modern C++ (на ангельском) (2015) - https://goo.gl/uImH0J
Скотт Мейерс - Эффективное использование STL (2002) - https://goo.gl/QtS8Dc
Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ (2005) - https://goo.gl/Cpk4YR
Наиболее детальные описания языка:
Бьерн Страуструп - Язык программирования C++ (на ангельском) (2013) - https://goo.gl/XkAiOX
Бьерн Страуструп - Язык программирования C++ (2010) - https://goo.gl/iZBDiV
Стандарт C++14 (на ангельском) - https://github.com/cplusplus/draft/raw/master/papers/n4140.pdf
Последняя на данный момент версия черновика стандарта C++17 (на ангельском) - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4527.pdf
Тонкости языка (для гурманов):
Андрей Александреску - Современное проектирование на C++ (2002) - https://goo.gl/e1V5BC
Герб Саттер - Решение сложных задач на C++ (2002) - https://goo.gl/iWaa6S
Герб Саттер - Новые сложные задачи на C++ (2004) - https://goo.gl/4nn512
Также для легкого чтения подойдет книжка c историей создания C++:
Бьерн Страуструп - Дизайн и эволюция C++ (1994) - https://goo.gl/FqbPwo
Отдельные аспекты:
Читать по необходимости.
Энтони Уильямс - Параллельное программирование на C++ в действии (2012) - https://goo.gl/qJfBkD
Николаи Джоссатис - C++. Стандартная библиотека (2012) - https://goo.gl/PEyiMH
Дэвид Вандевурд, Николаи Джоссатис - Шаблоны C++. Справочник разработчика (2003) - https://goo.gl/0M4NpG
Роберт Седжвик - Фундаментальные алгоритмы на C++ (2001) - https://goo.gl/4jwxSl (части 1-4), https://goo.gl/yDuQgG (часть 5)
Q: Хуле тут так сложно? Я открыл учебник, там какой-то ад!
A: Попробуй учебники, изданные после 2011 года. Фичи последних стандартов не только добавили выразительности, но и серьезно упростили жизнь разработчиков. Теперь программировать на C++ стало проще, чем когда-либо! Это не отменяет необходимости прочитать несколько серьезных книжек, чтобы написать на нем что-то годное. Тем не менее, да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
Q: Ты охуел? В этих книгах по тысяче страниц! Хочу коротких статей.
A: Вот тебе блоги, факи, референсы и всякое такое:
Годный блог, в котором все просто и понятно тян не нужны кококок борщ - http://alenacpp.blogspot.ru
Блог с хорошо расписанными фичами новых стандартов - http://scrutator.me
Краткие описания библиотечных функций и контейнеров - http://ru.cppreference.com/w/ или более подробно на ангельском http://en.cppreference.com/w
Блог Герба Саттера (на ангельском) - http://herbsutter.com
Блог Скотта Мейерса (на ангельском) - http://scottmeyers.blogspot.ru
Куча других блогов (на ангельском) - https://www.quora.com/What-are-the-best-blogs-on-C++
Большой FAQ по C++ (на ангельском) - https://isocpp.org/wiki/faq
Q: Я не умею читать.
A: Можешь посмотреть какой-нибудь онлайн-курс:
Видеокурс на тытрубе - https://www.youtube.com/watch?v=atVgLRzl3rI
Еще один - https://youtube.com/watch?v=MOpF5lk3cLY
Среди прочих есть несколько курсов по C++ - https://stepic.org
И еще есть вот такое, если проникся:
Видео с CppCon (на ангельском) - https://youtube.com/user/CppCon/videos
Q: Я готов начать погроммировать! Куда мне писать код?
A: Под шиндошс удобно использовать IDE Microsoft™ Visual Studio®. Базовую версию (2015 Community) можно бесплатно скачать отсюда: https://goo.gl/qgAAc6 (русская версия) или https://goo.gl/WIPW9L (ангельская версия). Чтобы начать писать код, нужно запустить Visual Studio, кликнуть "Файл - Создать - Проект - Пустой проект", после создания кликнуть слева правой кнопкой мыши по пункту "Файлы исходного кода", выбрать "Добавить - Создать элемент - Файл C++". Свои хэллоуворлды писать в этот файл, в дальнейшем можно добавить другие файлы и хедеры. Чтобы скомпилировать и запустить проект, нужно нажать "Сборка - Собрать решение", а затем "Отладка - Запуск без отладки".
Под *nix, как правило, уже предустановлен компилятор gcc (если нет, используй sudo aptitude install gcc), так что достаточно сохранить хэллоуворлд, набранный в текстовом редакторе, и выполнить g++ helloworld.cpp и ./a.out. Но удобнее установить какую-нибудь IDE, например, Code::Blocks (sudo aptitude install codeblocks) и работать в ней.
Еще у нас есть IDE, призванная похоронить Visual Studio пока не особо получается. Она стоит денег, но можно украсть почти не протухшую версию на торрентах или получить бесплатную лицензию по скану студбилета, если ты студент. Удобные свистелки и перделки присутствуют. Тормоза и баги присутствуют. Кросплатформенность присутствует - https://www.jetbrains.com/clion
Можно также не устанавливать ничего, а запускать свои хэллоуворлды на http://ideone.com, выбрав в левом нижнем углу язык C++14.
Q: Не буду я все делать сам! Подавайте сюда софт, который все сделает за меня и подотрет мне жопу!
A: Без проблем:
Статический анализатор, который умеет находить в коде ошибки и неоптимальные места. Швабодный. Есть плагин для Visual Studio - http://cppcheck.sourceforge.net
Детектор утечек для Visual Studio. Предельно прост в прикручивании - https://vld.codeplex.com
Гугловские утилиты для контроля корректности кода - https://github.com/google/sanitizers
Гугловский фреймворк для автоматизации тестирования - https://code.google.com/p/googlemock
Q: Мне надоело писать велосипеды, какие у вас тут популярные либы?
Q: Нужно зделать %монструозная_хуйня_нейм, но я обосрался от одной мысли о написании ее с нуля, что же делать?
A: Гляди сюда:
boost
Бесспорно, это самый популярный набор C++-библиотек. Не будет лукавством сказать, что C++ во многом обязан популярностью именно ему. Воистину всеобъемлющий, boost способен удовлетворить твои самые скотские фантазии. В нем есть практически все - от математических функций до сетевых компонент, от инструментов тестирования до динамических типов. Функции для работы с твоей мамашей там тоже есть. Разумеется, все это швабодное и работает на любых платформах. И да, boost является своеобразным инкубатором хороших библиотек, поэтому наиболее удачные из них с большой вероятностью можно будет увидеть после принятия очередного стандарта уже как часть стандартной библиотеки.
Недостатком boost можно считать его размер - более 300 мегабайт. Большинство компонент boost не являются независимыми, и попытка использовать один единственный контейнер обернется фактическим подключением 2/3 всего присутствующего в комплекте. Таким образом, если boost не будет использоваться на полную, лучше юзать другие, более специализированные библиотеки.
http://www.boost.org - скачать бесплатно без смс.
http://sindicollo.blogspot.ru/2008/09/boost.html - документация к некоторым компонентам.
http://www.boost.org/doc - документация (на ангельском).
Литература:
Ариндам Мукерджи - Learning Boost C++ Libraries (на ангельском) (2015) - https://goo.gl/b0gPN1
Qt
Существует швабодный кроссплатформенный фреймворк-надмножество C++ под названием Qt. Он содержит довольно большое количество компонент (для работы с сетью, базами данных, для юнит-тестирования и др.), но киллер-фичей и основным полем его применения являются возможности по разработке графических интерфейсов. Qt сам по себе, как расширение языка, предоставляет для этого более удобные средства, чем обычные библиотеки, а использование специализированных IDE наподобие Qt Creator позволяет в буквальном смысле собирать интерфейсы мышкой, а код писать только по существу.
Тем не менее, использование Qt нельзя однозначно назвать хорошей практикой. Во многом это уже не C++, а другой язык, со своими концепциями и паттернами. Qt-код требует дополнительного препроцессинга при помощи встроенных в Qt утилит (т.н. метаобъектная компиляция), поэтому не получится просто подключить Qt как обычную библиотеку и использовать свой любимый компилятор без дополнительного софта. Нельзя сказать, что это существенное препятствие, но есть мнение, что использование Qt нарушает дух C++, раздувает машинный код и порождает макак-любителей кодогенерации.
В настоящее время основные версии Qt - 4.8 и 5.х, полной обратной совместимости между ними нет как в пистоне, ага.
http://www.qt.io/ru - скачать бесплатно без смс.
http://doc.crossplatform.ru - документация к 4.8.
http://doc.qt.io - более полная документация к обеим версиям (на ангельском).
Литература:
Макс Шлее - Qt 5.3. Профессиональное программирование на C++ (2015) - https://goo.gl/aZ66gK
Макс Шлее - Qt 4.8. Профессиональное программирование на C++ (2012) - https://goo.gl/Slb1In (книга) + https://goo.gl/toUDWc (исходники примеров)
Марк Саммерфилд - Qt. Профессиональное программирование (только Qt 4.х) (2011) - https://goo.gl/qpkZFm (книга) + https://goo.gl/LIIECh (исходники примеров)
Другие хорошие библиотеки:
Несколько специализированных библиотек для часто встречающихся задач. Все маленькие, быстрые и простые в освоении:
libcurl - сишная библиотека для работы с сетью (существует также curlpp - крестовая обертка для нее, но использовать ее не стоит, ибо разработка заброшена еще в 2009 году) - http://curl.haxx.se
SFML - работа с графикой и аудио - http://www.sfml-dev.org
FLTK - графические интерфейсы - http://fltk.org
И еще куча библиотек на любой вкус - http://en.cppreference.com/w/cpp/links/libs