Вы видите копию треда, сохраненную 31 января 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Но местный сброд, участливый к нему,
Алкает жадно: "Я согласен взяться!"
Ликуй же ныне, ибо есть чему:
В тред вполз с вопросом отрок из гейдева:
"Как мне хранить текстуры, не пойму?"
Лишь крестоблядок не сгорит от гнева
И будет поощрять столь низкий вздор,
Тщась разогнать тоску родного хлева,
Ведя пять дней с невеждой разговор.
TL;DR Читаешь https://goo.gl/kVaela , делаешь примеры и суешь в http://ideone.com , ошибки копипастишь в гугл, непонятное ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее. И прочитай FAQ, расположенный ниже, в нем много полезного.
Унаследованная памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Старший брат: >>609376 (OP)
Предыдущий: >>615922 (OP)\r\n\r\n
\r\n\r\nFAQ:
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
Скотт Мейерс - Эффективный и современный C++ (2015) - https://goo.gl/Im8VYQ
Скотт Мейерс - Эффективное использование 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/n4567.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++ (2009) - https://goo.gl/isSt7j
Дэвид Вандевурд, Николаи Джоссатис - Шаблоны 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
Блог еще одной тянки, много о Qt и оптимизации (на ангельском) - https://katecpp.wordpress.com
Куча других блогов (на ангельском) - 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\r\n\r\n
\r\n\r\nQ: Я готов начать погроммировать! Куда мне писать код?
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, например, весьма удобную CodeLite (sudo aptitude install codelite codelite-plugins), и работать в ней. Ее также можно использовать и в шиндошс, но тогда сперва придется установить MinGW (http://mingw.org).
Еще у нас есть 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://www.solarix.ru/for_developers/cpp/boost/boost-library-list.shtml - краткие аннотации к большинству компонентов.
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
https://arhivach.org/thread/94971/
https://arhivach.org/thread/94972/
https://arhivach.org/thread/99414/
https://arhivach.org/thread/100995/
https://arhivach.org/thread/105148/
https://arhivach.org/thread/109335/
https://arhivach.org/thread/112797/
https://arhivach.org/thread/114519/
https://arhivach.org/thread/117109/
https://arhivach.org/thread/120019/
https://arhivach.org/thread/122683/
https://arhivach.org/thread/124637/
https://arhivach.org/thread/125532/
https://arhivach.org/thread/127327/
https://arhivach.org/thread/128133/
https://arhivach.org/thread/134437/
https://arhivach.org/thread/135285/
Старые ненумерованные треды:
https://arhivach.org/thread/45477/
https://arhivach.org/thread/48611/
https://arhivach.org/thread/60085/
https://arhivach.org/thread/66322/
https://arhivach.org/thread/69413/
https://arhivach.org/thread/73221/
https://arhivach.org/thread/77999/
https://arhivach.org/thread/79194/
https://arhivach.org/thread/82038/
https://goo.gl/vvs9GP
https://goo.gl/ZnBsYt
Отдельные Qt-треды:
https://arhivach.org/thread/15387/
https://arhivach.org/thread/65590/
https://arhivach.org/thread/94971/
https://arhivach.org/thread/94972/
https://arhivach.org/thread/99414/
https://arhivach.org/thread/100995/
https://arhivach.org/thread/105148/
https://arhivach.org/thread/109335/
https://arhivach.org/thread/112797/
https://arhivach.org/thread/114519/
https://arhivach.org/thread/117109/
https://arhivach.org/thread/120019/
https://arhivach.org/thread/122683/
https://arhivach.org/thread/124637/
https://arhivach.org/thread/125532/
https://arhivach.org/thread/127327/
https://arhivach.org/thread/128133/
https://arhivach.org/thread/134437/
https://arhivach.org/thread/135285/
Старые ненумерованные треды:
https://arhivach.org/thread/45477/
https://arhivach.org/thread/48611/
https://arhivach.org/thread/60085/
https://arhivach.org/thread/66322/
https://arhivach.org/thread/69413/
https://arhivach.org/thread/73221/
https://arhivach.org/thread/77999/
https://arhivach.org/thread/79194/
https://arhivach.org/thread/82038/
https://goo.gl/vvs9GP
https://goo.gl/ZnBsYt
Отдельные Qt-треды:
https://arhivach.org/thread/15387/
https://arhivach.org/thread/65590/
Написал такую хуйню: https://ideone.com/hznxek
Ты уверен? Обычно циклы с until работают до тех пор, пока НЕ выполнится условие until. Но все пидорасы в книгах об этом цикле думают по-разному.
По смыслу там не может быть do while, потому что здесь: while(v < p) i++; надо сканировать массив до тех пор, пока элементы меньше опорного. В do while пришлось бы добавить отрицание.
Главное знать где и что искать. А подробности можно посмотреть на cppreference.com
Не прояснишь мне по поводу стека? Почему в нем операции выполняются быстрее, чем в куче?
Потому что стэк всегда лежит в кэше процессора, а обращение к оперативной памяти в случае cache miss занимает 200 тактов. Плюс выделение/освобождение памяти на стеке - это прибавление-вычитание 1 указателя, а в куче - зависит от аллокатора и деаллокатора. Стандартный malloc/free медленный.
В общем случае скорость чтения из стека и кучи одинакова. Куча замедляется, только если она сильно фрагментирована.
Если данные вылетят из кешей, то лови чтение из оперативки. А кешей всего то ~35 мегабайт
В каком-таком общем случае, поехавший?
>35Мб
Это на йоба-серверах? Или я настолько отстал от жизни, что пропустил момент, когда стали распространенны процессоры с огромным кешем?
Он, видимо, дефисчик проебал.
>Что лучше freopen или fstream?
fstream
>>622597
>Для чего нужно явное создание экземпляров?
Для того же, для чего и явное создание переменных встроенных типов.
>>622611 (OP)
OP вообще красавчик со стихом в этот раз.
у меня будет где-то год-полгода фри (висеть на шее) , с каким из языков где-то после месяцев 6-9 можно делать хоть какие-то подделки и зарабатывать хотя бы на еду 2-3к рублей в месяц ?
Прочитать и вывести 100 мегабайт через fstream занимает 480 миллисекунд, а через freopen 6.8 СЕКУНД. В чём дело? Есть какие-нибудь подводные камни для этих способов ввода? Ничего кроме getline придумать не могу, но он везде работает.
6-8миб. Ошибся чутка
Потому что ты пишешь на C++ , а не C .
Я сделал вот так, но результат у меня кривой: http://ideone.com/CN3Ru7
Помогите выяснить, почему и что не так. Результат для d5 пикрелейтед.
Там где z ты хуитой какой-то занимаешся. Точнее не хуитой, там ходы слона высчитываются, а тебе конб нуэен.
Да нет, мне именно слон и нужен.
Просто одна полоса справа от позиции фигуры почему-то пропускается, а я всё не могу обнаружить, в чём проблема.
Основы кодинга, знающему несложно вероятно будет. Сессия завтра.
Лабораторная работа № 1
Классы. Основные понятия
- Создать класс указанный в задании, содержащий конструктор, поля, перегруженные методы (примеры полей и методов даны в задании, можно создать поля и методы по своему усмотрению).
- Продемонстрировать работу с классом (создание экземпляра класса, изменение значений полей, вызов перегруженных методов)
Вариант 1==
Класс «Растение»
Поля: тип (дерево, куст и т.д.), высота и т.д.
Для поля «тип» использовать тип данных enum
Методы:
a.\tсравнение по высоте двух растений, в метод передается высота растения, с которым требуется сравнить текущее
b.\tсравнение по высоте двух растений, в метод передается экземпляр класса «Растение», с которым требуется сравнить текущее
И там 5 лаб. Скажите, большой ли это объем работы и в какую сумму может оцениваться?
В 46 строке, у тебя всегда выводить пробел, если не был выведено 'B'. А кроме этого пробел не нужно выводить если ты перед этим вывел '*'.
Хуйня ниачем. Оценят в самый минимум. Если ты по специальности погромизд, то этого вообще недостаточно.
Держи урок https://www.youtube.com/watch?v=EpjVri1AZZc
Но это задание целиком было, без моих решений.
За видео спасибо.
> str.replace(str.find(str2),str2.length(),"preposition");
Почему здесь порядок ыполненя не нарушен? Он же может сначала str2.length() посчитать, а потом str.find(str2).
Можно как-то пофиксить?
Пытаюсь запихнуть остальные условия (с выводом "B" и "*") в цикл с z, поебавшись при этом с break/continue - пока безуспешно, и, похоже, так и останется.
С оф сайта качай
Анон, скажи когда уже будут модули?
тактактак, наканецта можно перегрузить operator.
так я так и сделал,но она обновления для винды ставит,после чего ни одна программа не запускается
operator-> уже есть, для симметрии
у меня будет где-то год-полгода фри (висеть на шее) , с каким из языков где-то после месяцев 6-9 можно делать хоть какие-то подделки и зарабатывать хотя бы на еду 2-3к рублей в месяц ?
Спасибо
>но в университете учил с++
Разве в университетах не преподают обычный Си только с классами (то есть древний как говно мамонта С++)?
>, и подумываю над с#
У шарпоблядей свой тред. Вообще, если ты знаешь Си или С++, тебе любой язык будет даваться намного проще, так как от Си пошли большинство ЯО, а С++ включает в себя огромное количество идей. Но я сомневаюсь, что ты в универе учил С++.
Интересно. А какие языки программирование используют военные, имеющие отношение к такому оружию?
udk
[code]
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
\tQApplication a(argc, argv);
\tWidget w;
\tw.setWindowFlags(Qt::WindowStaysOnBottomHint); //this
\tw.show();
\treturn a.exec();
}
[/code]
ничего не меняется, окно как окно. Меняю Bottom на Top - окно исправно висит поверх остальных. qt-opensource-windows-x86-mingw492-5.5.1 ЧЯДНТ?
https://doc.qt.io/qt-5/qt.html#WindowType-enum
>Informs the window system that the window should stay on bottom of all other windows. Note that on X11 this hint will work only in window managers that support _NET_WM_STATE_BELOW atom. If a window always on the bottom has a parent, the parent will also be left on the bottom. This window hint is currently not implemented for OS X.
Написано, что не работает в OS X, про windows ничего, намекает на то, что должно работать.
ну не то что я прям учил с++ , на 1 семестре алгоритмы на с++ , на втором пролог и лисп , 3 и 4 семестр ооп на с++ , а на 5 асп.нет на шарпе , учился на граф.дизайнере но понял , на ласт семестре что не мое и хочу быть программистом , учюсь в польще (мимохохол)
Инициализируй не при объявлении.
А. Кажется понял. Надо было сделать после объявления класса что-то вроде:
int A::counter = 0;
Так?
https://ideone.com/WNADdy
было: ошибка: ISO C++ запрещает инициализацию внутри класса неконстантного статического элемента «A::counter»
> почему так нельзя?
Ну, Страусс утверждает что якобы если такое разрешить то плюсы поломаются http://www.stroustrup.com/bs_faq2.html#in-class но, честно говоря, я не понимаю в чем проблема.
Ты создал объект, изменил значение этой переменной. И создаешь другой объект. Какое значение будет у нового объекта?
А в разных модулях могут быть разные static storage и в них разные значения твоей переменной. Как все это отслеживать?
Короче, как всегда. Старпёры не хотели забивать на убогие компоновщики или тупо не осилили.
Зато на модули какой хайп подняли, стены дрожат.
Илюшь, съеби обратно в го-вно тред.
Нестатические члены можно так инициализировать.
QObject::connect(this->obj_timer, SIGNAL(timeout()), this->objcts, SLOT(RefreshOL()));
obj_timer, objcts - объекты структуры, откуда исходит коннект
Ошибка на 40 строк, я уж не знаю, что забыл тут
Помню, была подобная ошибка, решалась парой символов
На c++ библиотеки. Из шарпа тупо к ним обращаешься. Вижу так. Буду пробовать так когда-нибудь.
istringstream, ostringstream, stringbuf - в чём необходимость этого при наличии stringstream? Вроде об одно и том же, на первый взгляд.
Недостатков нет. Просто сложнее чем указатели. Разве что операции с указателями не выбрасывают исключений.
Нельзя изменить ссылку. Значение по ссылке - да, но не саму ссылку.
Ну и в некоторых случаях можно отстрелить ноги, если исходный объект умрёт раньше ссылки.
Код с исключения течет как твоя мамаша, а чтобы не текло, нужно обмазыватья RAII и только RAII, а также copy-and-swap и прочими методиками.
>>623618
Не надо использовать в одном случае - когда нет владения и ты 1000% уверен, что объект будет жить дольше, чем указатель. В остальных случаях надо.
В крестах без подключения нестандартных расширений - нет. Это же не интерпретируемый язык, в рантайме остаются только машинные команды, а исходники неизвестны уже. Можно сделать самомодификацию на уровне ассемблерного кода, но это все будет нестандартным, платформозависимым, и потребуется, возможно, менять настройки оси, чтобы разрешить перезаписывать сегмент команд.
Владение - это когда при уничтожении обладающего объекта должен уничтожиться обладаемый (или уменьшиться его счетчик ссылок при соместном владении). Например, vector владеет тем, что в нем хранится, и при уничтожении вектора в его деструкторе он пройдется по своим членам и вызовет деструктор каждого.
Например, представь, что у тебя есть граф с кучей нод и циклическими ссылками друг на друга. Ты не можешь сделать ссылки с помощью shared_ptr - потому что в таком случае возможна утечка памяти (когда 2 ноды ссылаются друг на друга, у них счетчик ссылок равен 1 и поэтому они не удаляются, хотя из внешнего мира они уже не доступны).
Поэтому тебе нужно придумать владельца (например, Graph), внутри которого будут unique_ptr на каждую из нод (и при уничтожении Graph у тебя уничтожатся ноды), а вот между нодами уже можно делать обыкновенные простые указатели. Или shared_ptr, если ты хочешь делить ноды между графами, тогда между нодами можно будет завести weak_ptr. Далее, придется написать ad-hoc сбощик мусора в классе Graph, который бы подчищал память.
>>623650
Это называется метапрограммирование.
Про это хорошо написано у Саттера-Александреску в Coding Standards. Приватное наследование это, по сути, аналог композиции, и композицию обычно использовать лучше. Но бывают ситуации, когда это не так, например, если ты пилишь стратегии и хочешь, чтобы пустой базовый класс оптимизировался и не жрал памяти.
Да, это используют обычно только для вирусов и прочей хуйни, где иначе никак. Надежность очень маленькая.
Ты сначала винду с офсайта скачай, вообще по софту вопросы в /s задают.
Еще вот что вспомнил. Была такая либа типа http://demonastery.org/2011/04/c-eval-hell-yes/ , возможно, что не именно эта, но суть та же - она не самомодифицировалась, а компилировала новую версию своего кода установленным в системе gcc, после чего делала exec на новый бинарник, чтобы дальше выполнялся он. Такой аналог eval из интерпретируемой параши. Работало довольно медленно, поэтому с большой софтиной пришлось бы долго ждать перекомпиляции, но все равно интересная штука. Возможно, тебе подойдет.
obj_timer и objcts — действительно у наследованы от QObject?
алсо Q_OBJECT макрос нигде не проебал?
На виртуалке, что ли? Хорошая идея.
Оптимизации некоторые недоступны, но один хрен быстрее Java.
Если компания пишет не виндоус-специфик код, то все на линупсах сидят.
А не пояснишь по поводу вышки. Это обязательное условие? Или просто надо показать на собеседовании себя хорошо?
ПОТОМУ ЧТО МЫ ПЛОТИМ ЭТИМ ПАРАЗИТАМ, ВОТ ПУЩАЙ СТРАДАЮТ!!!111 НАПОКУПАЮТ РАБАМ ЯБЛОК, А ПОТОМ ОНИ РАБОТАТЬ НЕ ХОТЯТ
>Чем ecipse хуже например?
1. кол-во NullPointerException за единицу времени
2. уебаношным интерфейсом
>Посоветуйте ide for C++ кроме вс.
kdevelop
Код блокс
На порядок удобнее всего остального, так что прощаются все косяки, да с запасом.
Из легковесных пробуй CodeLite, там тоже неплохое автодополнение, хотя сильно хуже, конечно же.
Проебал, действительно
За О(M) в среднем делается проверка на интересность (если прикрутить массив из ста ячеек и нехитрую логику, которая будет дропать итерацию, как только число встретилось не первый раз, а предыдущее ему не равно). Всего проверок надо будет 2^100 (максимум можно выбросить сто чисел, всего вариантов будет сумма биномиальных коэффициентов). На 10к должно 2^100*O(M) должно летать, так что вперед.
>На 10к должно 2^100*O(M) должно летать, так что вперед.
петросян.жпег
>>624098
>>624078
кароче, идеи такие:
1. "интересность" — это значит что последовательность состоит из наборов AAAABBCDDEE, т.е. одинаковые числа должны идти подряд вместе
2. чтобы получить интересную последовательность, нужно либо удалить все числа на промежутках между двумя одинаковыми, либо сами одинаковые числа
т.е. имея ABCADEA, нужно либо сносить B,C,D,E либо A
Sublime Text + cmake + scan build + valgrind + gdb + компилятор (выставишь через cmake нужный).
И как выбрать? Нетривиальный алгоритм уже будет. К примеру, CBCBBB. С точки зрения C, надо удалять B, ибо 2 против 1, а с точки зрения B (и на самом деле) надо удалять C, ибо 4 против 2. В сложном случае придется многократно обходить всю последовательность, чтобы понять, что же действительно надо удалять в первую очередь. А разделять и властвовать не получится, пример выше показывает, что локальная оптимальность не дает правильного ответа.
если есть последовательность ABCABDA, то очевидно, что:
1. если в искомой посл. есть A, то в искомой посл. не может быть B,C,D
2. если в искомой посл. есть B, то не может быть A,C
3. если есть C, то не может быть A,B
4. если есть D, то не может быть A
т.е. получается какой-то граф..
Двумерная динамика наверно.
проще не стало
Что? Какая вышка?
Пожалуй, самая мощная среда разработки, в которой есть все. Ещё и бесплатная. А новый режим дебага с анализом памяти вообще красота.
Но для лабы2 ничего этого не нужно.
Да и не только лабы2.
st3+clang+gdb достаточно
Два успешных билда этому.
Если упростить формулировку, то это задача на поиск длиннейшей не убывающей подпоследовательности
За O(n^2) можно сходу решить, n - длина начальной последовательности
>к концу года задачи становятся труднее и интереснее
>увлекательнейшую задачу
>интересная последовательность
Даун-аутист пытается вызвать ИНТЕРЕС к своему говну, но не может, и поэтому от бессильности заставить людей есть говно увлекает их ИНТЕРЕСНЫМИ эпитетами. Прямо как Лавкрафт, который пугает СТРАШНЫМИ словами.
нихуя. там нужно числа в начале выкидывать тоже
Так что с алгоритмом? Он пока самым правдоподобным выглядит.
Не знаю точно, но абсолютно уверен что нет
Хуйня какая-то, если честно. Community edition должна быть бесплатна, пиздос какой-то, может там просто надо учётную запись создать или еще какую-то поеботу, но она 100% должна быть бесплатна, а имеет почти всё ,что нужно.
Дык запиши его, никто тебя не сдеанонит и на ебло ссать не станет. Денег не снимают, просто зарегаться просят.
Бесплатна. Учетную запись надо.
Значит зарегай на свою мамку/папку/бабку/кота.
Палю годноту для совсем ананасиков: https://www.google.ru/search?client=ubuntu&channel=fs&q=online+phone+number+for+verification&ie=utf-8&oe=utf-8&gfe_rd=cr&ei=OGGVVoicGIrIYMPZpMAM
Перед кем? Пиндосами, у которых таких миллиона? В заговор массонов-рептилоидов веришь?
бамп
Wut?
>интересная последовательность
Дурачок, я эту задачу уже не в первый раз встречаю. Про "интересность" не тот анон придумал, чтобы заманить, это условие такое в оригинале.
а)
int main()
{
}
или
б)
int main() {
}
"а" разумеется, "б" говно вырвиглазное.
Не принципиально. Вот у if/while/for нужно использовать только { на той же строчке (а) используют только ньюфаги, пришедшие с паскаля, да Штульман), а для функций - не принципиально, но лучше унифицировать с if/while/for, почему нет. Ведро, книги K&R и Страуструпа, хромиумы и прочее говно используют б) (точнее, Страуструп использует а) для функций, но он вообще обожает влепить где-нибудь ебнутый частный случай). Короче, только 1TBS.
Только (б). Экономим вертикальное пространство ибо функции должны умещается в 20 строк, каждая строчка на вес золота :3
Байтоеб чтоле или пиздонист?
Господа пишут с размахом, не экономя место, с пустыми строками для визуального разделения. Код получается легковесный, легко читаемый. И компактный, если ты не долбокряк.
Пустые строки для абзацев - это другое. В том-то и дело, что от этих висящих скобок толку нет, абзацевость только теряется.
int main() { }
Так пишу. Мои функции всегда помещаются в одну строку на монитоде 21/10. Пустые строки для пидорасов и нюфагов.
Пожалуй бампану.
Сама обновится до 10-ки скоро :)
Не надо никакого телефона, блджад, необучаемая сука. Dreamspark-логин выдают по почте в домене .edu или аккаунту втентакле, Dreamspark Premium можно получить у админа в своем вузе. И все, блядь, сразу получаешь ключи, никакого телефона не нужно.
Иди заплати Балмеру еще 5к зелени за топовую версию студии, пока я получаю все бесплатно, маня.
но что дальше? я просто н понимаю какой путь искать и какие веса рёбрам/вершинам ставить.
Ну раз единственное действие это удалить все вхождения, то, наверное, нужно весами ставить общее количество экземпляров числа. А потом добиваться отсутствия ребер удалением суммарно наименьшего веса вершин.
Получается набор отрезков. Если 2 отрезка пересекаются, значит такой комбинации быть не может.
Гуглим задачу non intersecting objects maximum, это https://en.wikipedia.org/wiki/Maximum_disjoint_set#1-dimensional_intervals:_exact_polynomial_algorithm . Все?
Свои лабы можешь писать как угодно.
А в индустрии ценится читаемый и понятный код, а не выкрутасы уровня куайнов
Но зачем? Коммунити версия просит только лайв аккаунт. И все. Каждый месяц просто заново заходишь в свой аккаунт из студии, и лицензия обновляется
Точнее, нужен weighted max disjoint set, потому что у нас есть веса - количества элементов.
> суммарно наименьшего веса вершин
Не понял что это. Он будет минимальный если вообще не брать вершин.
Седжвика из пасты нирикомендую. Перевод лютое говно, убивающее желание читать.
Можно напердолить под чистый c++
Ты удоляешь вершины так, чтобы граф стал без ребер (компонент связности столько же, сколько вершин), но при этом из всех вариантов выбираешь тот, где сумма весов удаляемых вершин наименьшая.
А оригинал?
>Ты удоляешь вершины так, чтобы граф стал без ребер
Это алгоритм какой-то известный или перебором? Там 2^n вариантов удаления.
Там может сработать жадный алгоритм, по идее. У каждого ребра удалить ту вершину, которая имеет меньший вес. Но нужно будет учитывать общие для нескольких ребер вершины, ибо иногда выгоднее удалить вершину с большим весом, за счет того, что она покроет сразу несколько ребер.
К примеру, можно от весов ребер перейти к нормализованным весам: из каждого веса вычесть веса всех смежных вершин. Потом просто удалять вершины по возрастанию этих нормализованных весов (и декрементировать веса, разумеется), пока ребра не кончатся.
>т.е. одинаковые числа должны идти подряд вместе
Ты вторую картинку глянь, там интересной названа последовательность (1,2,5)
Ну так все правильно, они же не повторяются.
Пруфы, что np-hard.
Стой, а на второй что удалять? У них количество ребёр разное, а веса одинаковые.
Блять туплю. По ним пройтись надо и ребра оставшееся посчитать. Можешь не отвечать.
Да, не совсем допилено получается. Но я думаю, что на основе этой идеи должно получиться. Может, похимичить с вычитанием, чтобы явно выделялась центральная вершина.
Пытаюсь релизнуть неконсольную программу и получаю ошибку
LNK2001: unresolved external symbol _wWinMain@16
Если делаю этот же код как консольный проект тоже появляется LNK2001 но с __imp__ShowWindow@8 на конце
С консольным проектом проблемма решилась подключением в linker>input>additionalDependencies стопки разных .lib, по советам из интернетов
По какому принципу их нужно добавлять?
Придумай контрпример.
Не, не сработает так просто. Вот в этом случае оптимально удалить все крайние вершины, но алгоритм выберет одну из центральных. Думаем дальше.
Там же 2 центральных и они соединены ребром. Для удаления этого ребра по любому придётся. Одну из них удалить. А потом и 2 крайних.
Блин, точно. Но все равно меня терзают смутные сомнения, нет уверенности, что на любом оно сработает. Надо как-то формализовать штоле всю эту ебалу. Проблема в том, что после одного удаления приходится пересчитывать некоторые веса, и поэтому неочевидно, что можно просто хуярить по возрастанию, пока не кончатся ребра.
Я завтра напишу программу, а если времени не хватит, то на выходных и отчитаюсь сколько тестов пройдёт. Пока кажется единственное нормальное решение. Википедию с множествами я вообще не понял. В гугле тоже про это мало понятного.
Foo(Foo const &) = delete;
Ну я понимаю, что это фишка 11 стандарта и по сути запрещает реализацию конструктора копирования или чего угодно другого. КК по умолчанию тоже не будет вызываться? Попытка вызвать конструктор приводит к ошибке во время компиляции?
Как вообще называется эта фича, чтобы ее можно было нагуглить?
Удаленный конструктор же, он запрещает компилироваться коду, в котором вызывается конструктор копирования. На дефолтный конструктор (и все остальные) это напрямую не повлияет, но дефолтный не сгенерируется, как и в любом другом случае, когда ты сам определяешь какой-то из конструкторов.
Очевидно, платный
Блять, ну и хуйню же я написал. Суть в том, что Б1 и Б2 - это один и тот же базовый класс, но в производном классе Н2 они оба используются и имеют разные значения полей.
Тогда это не должно компилироваться же, если ты не юзаешь виртуальное наследование.
Есть базовый класс ДАТА, у которого есть поля д/м/г. Есть производный от ДАТЫ класс ФАЙЛ, в котором ДАТА - это дата создания файла. И есть производный и от ФАЙЛА и от ДАТЫ класс, в котором ДАТА из ФАЙЛА - это дата создания, а другая ДАТА - это дата редактирования.
>>624913
Виртуальное мне не подходит, т.к. две ДАТЫ не обязательно одинаковы.
При вызове метода вывода ДАТЫ будет неоднозначность, нужно как-то от нее избавиться.
Ну вон же на википедии есть пример.
https://en.wikipedia.org/wiki/Virtual_inheritance
Хоть и делаешь ты какую-то дичь
Пиши Н1::поле. Но напрямую наследоваться от Б1 все равно будет нельзя, ибо ты не сможешь никак отличить поля, унаследованные из Н1 и напрямую из Б1.
Ты определенно делаешь что-то не то.
Жопой читаешь.
In order to call eat(), the same disambiguation, or explicit qualification is needed: static_cast<Mammal&>(bat).eat() or static_cast<WingedAnimal&>(bat).eat() or alternatively bat.Mammal::eat() and bat.WingedAnimal::eat(). Explicit qualification
В том и дело, что пустые строки и так много места занимают, а сами блоки (if, for, while, итд) пускай будут поэкономнее.
Используй композицию вместо наследования, Люк. Заведи в производном классе джва члена базового класса и все. Сейчас ты вскукарекнешь, что тогда нельзя будет делать касты указателей, но я отвечу, что в твоем случае допустимо только приватное наследование, которое и так не допускает касты. Публичное наследование должно удовлетворять отношению "объект производного класса является объектом базового класса", а у тебя такого не будет, будет какая-то двойная нех.
Спасибо, анончик, вот это, я думаю, мне как раз подойдет.
У меня открыто 4 окна на мониторе 1920x1200, получается на окно даже поменьше.
Открываю иногда и по 3 колонки окон, в два окна по вертикали. Но монитор всего 24 дюйма. Один.
У меня 17.
Полезно, затекать не будет
В этом плане у него лучше, нежели 3 монитора в ландшафтной ориентации
Нажми ok, он тебе и скачает. А что из этих двух тебе нужно - сам решай. Для себя пойдёт первый, для ковыряния легаси - второй.
Да спасибо, разобрался
Уже написал свою 1 крутую программу - перевод строки чаров в фски номера.
Сяп. codeblock+sfml. При попытке компиляции проекта пишет default is untitled. Отдельный файл (он же пока единственный) компилирует, но не запускает, ссылаясь на отсутствие на компе sfml-graphics-2.dll, хотя она есть. Что делать?
СФМЛ подключена как в гайде написано.
Пробовал. Все равно. К тому же, я думаю, тут в другом дело. Проект не компилируется, а файл компилируется. Мне кажется, что проект не компилируется по той же причине, по которой потом программа на запускается, но я хз, почему. Когда сфмл не было, он об этом говорил в виде ошибок компилятора, не распознававшего функции сфмл, сейчас с этим вроде все норм, но все равно проблема именно с либами этой библиотеки
Вопрос касательно использования указателей. Навскидку могу придумать два случая, когда они нужны:
Когда нужно передать "большие данные" (массив) между функциями, тут понятно, выгодней передать указатель.
Или когда заранее неизвестен объем данных, который потребуется, можно динамически выделять память оператором new.
В каких еще случаях лучше использовать указатели, а не обычные переменные?
Пилю прогу на qt для работы, пытаюсь понять, где что лучше использовать.
>Когда нужно передать "большие данные" (массив) между функциями, тут понятно, выгодней передать указатель.
константную ссылку используй
>Или когда заранее неизвестен объем данных, который потребуется, можно динамически выделять память оператором new.
vector используй
>В каких еще случаях лучше использовать указатели, а не обычные переменные?
графы, деревья, когда размер типа заранее неизвестен из-за наследования, pimpl
>Когда нужно передать "большие данные" (массив) между функциями, тут понятно, выгодней передать указатель.
Открою секрет - в C++ нельзя передать массив по значению. http://cpphints.com/hints/38
>В каких еще случаях лучше использовать указатели, а не обычные переменные?
Всегда, когда тебе нужно использовать какие-то данные вне этой функции/класса, или у тебя большой объём данных (зависит от настроек конпелятора, но максимальный размер всех "обычных" переменных где-то 4 мб).
Вся разница между "обычными" переменными и "динамически выделенными" указателями в том, что первые выделяются на стёке а вторые - на куче.
Стёк - быстрее, почти бесплатное выделение памяти. Возвращать из функции стёковую переменную по ссылке нельзя - после возвращения из ф-ции стёк уничтожается.
Куча - медленнее, но твои данные некуда не денутся пока ты их сам не вычистишь и не имеет ограничений в размере.
Нет, это не связано.
Нет. Мув, грубо говоря, перемещает данные а не перевыделяет память. Если ты, например, заранее выделишь память в куче - то вполне можно перенести.
Алсо, с кучи в стек ничего выделять руками не нужно, но если переносишь с кучи - не забудь подтереться.
Хотя хз насчёт именно переноса, я не проверял, но у меня такое ощущение что именно при таком раскладе вместо переноса будет просто вызван копирующий конструктор.
Мув меняет принадлежность. Если у тебя нетривиальный конструктор, ты должен сам определить конструктор переноса и конструктор копирования тоже, разумеется. Читай учебники.
>вместо переноса будет просто вызван копирующий конструктор
Это легко проверяется.
Задание: Дан массив типа BYTE размером не менее 256 Кбайт. Переписать его во внешнюю память поблочно. Операцию повторить 10 раз. Характеристика: размер блока (диапазон изменения 512-1024 байта).
Моя попытка решить: http://pastebin.com/EfGYjgfa
Проблема в том, что буфер нужно инициализировать не из файла, а из массива в оперативной памяти.(см. 70 строчку в пасте)
Нихуя она не скопируется, ебанутый.
Дебил, прежде чем в следующий раз кукарекать и нормальных людей вводить в заблуждение - проверь и подумай.
Генерируется implicit move ctor, Yoba(Yoba&&),
Это ты можешь проверить, добавив вывод "Yoba ctor called" в конструкторе, и убедиться что вызывается конструктор перемещения.
Ты об этом бы знал, если бы был в курсе про правила генерации специальных методов класса.
>добавив вывод "Yoba ctor called" в конструкторе
добавив вывод "Yoba move ctor called" в конструкторе перемещения
Спасибо за ответ, инфу по ссылке ща почитаю.
>Всегда, когда тебе нужно использовать какие-то данные вне этой функции/класса, или у тебя большой объём данных (зависит от настроек конпелятора, но максимальный размер всех "обычных" переменных где-то 4 мб).
А вот еще вопрос. Как адекватно выделять и освобождать память? Я имею в виду, как не проебать указатели на выделенную память и в нужные момент память освобождать? Какие-нибудь конкретные методики написания кода, инструменты отслеживания, сколько и в какой момент программа жрет и просирает памяти на утечках?
Как вообще эти вопросы решают грамотные пацаны? Я вроде и понимаю, что в некоторых функциях мне лучше передать указатели, а не копировать данные, но очкую, что в итоге поимею утечки памяти и трудноуловимые баги поведения программы.
Если у тебя массив выделен на стеке, то можешь передавать на него указатель
>Как адекватно выделять и освобождать память?
Когда считаешь нужным, в этом вся суть ручного управления памятью.
>Какие-нибудь конкретные методики написания кода, инструменты отслеживания, сколько и в какой момент программа жрет и просирает памяти на утечках?
Да куча их. И статические анализаторы кода, и гугловские санитайзеры, и хуитки типа валгринда.
Алсо, если не хочешь сам парится и не стоит важность суперпроизводительности - просто импользуй умные указатели.
Пишу под MSP430, столкнулся с непонятной вещью:
unsigned long flash_addr =
(unsigned int) page_num FLASH_SEG_SIZE;
memcpy(ram_temp, (void )flash_addr, FLASH_SEG_SIZE);
/ смотрю отладчиком, а здесь, после memcpy переменная flash_addr ВНЕЗАПНО ОБНУЛЯЕТСЯ /
Почему такое может происходить?
Мерзкая макаба!
Вот отформатированный код: https://gist.github.com/anonymous/6462edfcb45625e75772
Это вопрос к реализации memcpy в твоей хуитке.
Ну во первых, memcpy берёт размер в бпйтах, а не двойных словах.
Во вторых, пошёл вон со своей железякой в другой тред
У scoped и unique_ptr нет оверхеда
> Как адекватно выделять и освобождать память?
Особождать - ТОЛЬКО в деструкторе. Иначе у тебя будет текущий на исключениях код. Выделять, соответственно, только в парном деструктору конструкторе. Вот и вся наука.
>Я вроде и понимаю, что в некоторых функциях мне лучше передать указатели, а не копировать данные, но очкую, что в итоге поимею утечки памяти и трудноуловимые баги поведения программы.
Используй ссылки, написал же. Лучше константные, можно и неконстантные.
Есть шаблонныц класс с шаблонной функцией, например такой - www.ideone.com/w3BZXF . Когда все это в одном файле, работает, но стоит мне переместить определение шаблонной функции и ее специализации в .cpp файл, то появляются ошибки линкера.
А оставлять потенциально тяжелую реализацию в хидере, да еще и заинлайненную - это не лучшая практика, наверное.
Это одна из основных бед крестов. За удобство шаблонов и полиморфизм без замедления в рантайме ты платишь тем, что шаблоны целиком должны быть в хэдерах. Из-за этого компиляция сильно замедляется, но тут уж ничего не поделаешь.
Вместо sortfunc лучше бы сделал лямбду, раз у тебя auto и 11 стандарт.
Ты юзал тот алгоритм с взвешенными графами? Да, мне лень вчитываться до вечера, блджад. Тесты проходят?
не, у меня другой алгоритм, лень описывать, к тому же он похоже все равно не работает.
>Тесты проходят?
Нет только 3. Потом ответ завышен. Здесь тесты если хочешь проверить http://rghost.ru/6LVyKdZkX
Скомпилировать файл и положить в эту папку. Потом запустить test.bat с параметром имени файла без расширения. Результат в res файле будет.
И не лень было это всё писать?
Это плохая практика, суть шаблонов в автоматической генерации инстансов же. Такое будет немногим лучше макросов.
Макросы плохи не этим.
Ничего не меняется же, кроме лишней работы компиляторы если какие-то из перечисленых специализаций на самом деле не используются.
Только если у тебя лаба2 и шаблон какой-нибудь хуйни с джвумя инстансами на int и double. В реальности шаблоны используются гораздо многограннее, начиная от non-type parameters ты для всех натуральных чисел вызывать инстансы будешь, да?, и заканчивая library-like ебалой навроде самодельных концептов и метафункций.
> ты для всех натуральных чисел вызывать инстансы будешь, да
Любая специализация шаблона известна во время компиляции, следовательно их спокойно можно указать явно. Единственной проблемой является то что у тебя будет список на тысячи (к примеру) специализаций, часть из которых была нужна когда-то, а сейчас нет - что лишняя работа для компилятора.
Ну так определись, если ты хочешь ускорить компиляцию, вынося методы из хэдеров, то это не вяжется с "лишней работой для компилятора" по генерации сотен ненужных инстансов.
Каждое уникальное число в входной последовательности можно представить в виде отрезка у которого начальная координата равна индексу первого появления этого числа, конечная координата - индексу последнего появления (могут совпадать) и есть еще характеристика "вес" которая равна количеству появлений этого числа в последовательности. Тогда задача сводится к нахождению набора непересекающихся отрезков с максимальным суммарным весом - этот сумарный вес и есть ответ. Мне почему-то кажется что это NP-полная задача, тоесть нужно применять какой-то метод оптимизации. Я попробывал простой перебор через рекурсию http://ideone.com/dnXRkk но он отрабатывает только на небольших (по количесву уникальных чисел) задачах (первые 16 из твоих тестов). На больших задачах (важно количество уникальных чисел, а не длина последовательности - по длине там линейная сложность) моя писанина ожидаемо обсирается, причем серьезно - для 100 уникальных чисел похоже в лучшем случае нужны года, а скорее всего тысячелетия. Тоесть просто заменить рекурсию на итерации или "распаралелить" не поможет. Нужен какой-то метод оптимизации, но мне ничего простого не приходит в голову. Я пробывал ветвей и границ применить (так как он легко на полный перебор накатывается) но нихуя не придумал, был один вариант но он не помог, только еще один из первых тестов зафейлил из-за какого-то бага. Идеальный вариант конечно если окажется что тут не NP-полнота. Если задачка с олимпиадки то наверное так и есть - врядли там дают задачи на оптимизацию, хотя я хуй знает. Тоесть возможно есть нормальный способ решения.
Ты весь день этим занимался? Здесь авторские решение есть если поймёшь. Но вариант с графом который выше я на выходных сделаю и отчитаюсь если смогу написать.
http://pastebin.com/HF5g1RkC
http://pastebin.com/Fx2MigGq
Ну бамп, неужели икто не сталкивался? Что делать? Я даже собрать ничего не могу
Переустановил уже пять раз. Есть бубунту
> Ты весь день этим занимался?
Ты меня наверное перепутал с кем-то. Посмотрел твои решения, первый динамика, никогда не мог сам полностью придумать. Понимаю без проблем, даже с полунамека могу сообразить как решать а полностью сам никак. Другие подходы вроде норм, а в динамическом совсем ноль. Получается такое, если мой вариант подправить https://ideone.com/qbcLKs
Спасибо. Работает. Опишешь алгоритм? Знаю что смотреть программу, но после сортировки не совсем понятно что происходит.
Не пользовался студией ни разу. Слышал у неё дэбагер ахуенный с свистелками и перделками.
А что тебе нужно для разработки? Подсветка? Автокомплит? Навигация по именам? Отладка?
У тебя есть массив отрезков (начало, конец и вес) который сортируется по координате начала отрезка (у моего варианта там небольшой недостаток что отрезков всегда 100, я не хотел усложнять код, на ответ это не влияет но там получается что может быть дохуя нулевых отзрезков на бессмысленную обработку которых пробывается время). Дальше создается массив размером равном количеству отрезков, в i ячейке которого записывается оптимальный ответ при использовании первых i отрезков (из отсортированого массива). Тоесть в первой ячейке массива хранится оптимальный ответ при использовании только первого отрезка (это вес этого отрезка), во второй ячейке при использовании первых двух отрезков и так до конца. А потом ты постепенно добавляешь новые отрезки (тоесть увеличиваешь индекс i и заполняешь массив). Изначально в текущую ячейку этого массива записывается вес текущего отрезка - так как ты всегда можешь все выкинуть и взять текущий за основу. Потом ты проверяешь все которые ты заполнил до этого - если какой-то из рассмотренных ранее отрезков можно использовать вместе с текущим (ранний отрезок заканчивается до того как начнеться текущий), то ты используешь их вместе - суммируешь и записываешь в текущую ячейку, но просто так записать нельзя так как там может находиться большее значение от рассмотрения предыдущих отрезков - выбираешь максимум и его записываешь. И потом как заполнишь весь массив то максимальное число в нем и будет ответ.
Понял, спасибо.
result(i,i)=0
result(i,j)=max(result(i,start(k)) + weight(k) + result(end(k),j))
где i,j - номера точек, k - номера отрезков
Будут .o жуткого размера, и линковаться будет долго из-за необходимости вычищать неиспользуемое говно.
1. Ищем при помощи strlen начало пакета: $GPGGA, при помощи sscanf считывает это всё в кучу аргументов. Проблема в том, что ответов от GPS в буфере может лежать несколько штук разных, не будет ли этот способ медленным?
2. Конечный автомат, на вход принимает по одному байту.
При помощи atof, atoi выдернуть нужную мне информацию.
Пример строки:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
Кстати на самой олимпиаде компилировали без 11ого стандарта. И всякие лямбды делать нельзя.
Тут оптимизировать пытался. Сделал всего 1 массив размером n*k и за 1 проход всё выщитал без удалений. Но не уверен что оно сработало т.к. часть тестов по времени не проходят.
http://pastebin.com/7G0KpXxy
Понятия не имею. Один из авторов вообще в Си стиле пишет избегая vector'ов и fstream'ов.
Ну если цель - олимпиадное питушение, где важна 0,001 мс - правильно делает.
Алсо, попробуй зарезервировать память в векторе после инициализации или заменить его на статичный массив.
>заменить его на статичный массив
А как тогда его длину менять? Я же из двух вектаров 1 склеиваю.
А никак не менять. Взять сразу все 4 мб на стёке и молится что тестов там будет не 40 мб (лол).
По крайней мере через такой анус можно будет убедится, что нету оверхеда на аллокациях.
Алсо, скинь ещё сами тестики.
>Алсо, скинь ещё сами тестики.
http://rghost.ru/6vrVz6HT6
Скомпилировать файл и положить в эту папку. Потом запустить test.bat с параметром имени файла без расширения. Результат в res файле будет.
> стандарт не гарантирует, что по дефолту там 0.
Почему ты так пишешь? Судя по http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
на 190 странице указано что { } считается как braced-init-list
на 201 странице, где рассматривается инициализация с помощью "a braced-init-list" указано что "Otherwise, if the initializer list has no elements, the object is value-initialized"
на 191 странице, где дается определение value-initialized перечислено 4 случая, где первые два относятся к класам, третий к массивам а для скалярного типа остается "otherwise, the object is zero-initialized"
Ну и на 201 странице последняя строка "int k { }; // initialize to 0"
Да, твоя правда, я обосрался.
Чем ты занимаешся в 38-40 строках? тебе не нужно k раз физически инвертировать массив. Просто в зависимости от четности шага нужно искать или возврастающие или снижающиеся последовательности. И в конце один раз перевернуть если k нечетное. В зависимости от того как должны обрабатыватся последовательности равных чисел, можно обойтись и без удаления а делать вместо "удаленных" последовательностей типа "плато" - но там нужно продумать все ситуации. И если задание конечно вообще позволит такое сделать. Как вариант, заменять удаленные числа на заведомо невозможные значения - обратно же если такое возможно по заданию.
> или снижающиеся последовательности.
Имелось ввиду "или снижающиеся последовательности, при этом идя с конца массива к началу."
ЧЯДНТ?
Ctrl+D
Чтобы дать программе понять, что ты закончил ввод, введи Ctrl+Z
>Что значит конструкция if(!cin)
cin имеет bool'евые функции-члены о состоянии потока (несколько флагов). В частности, одна из них, успешно ли проходили все предыдущие записи (если ты не очищал этот флаг).
Называется она operator bool (совершенно самоговорящее название). Так вот, вызывается она тупое сравнением потока с логической переменной (или запихиванием внутрь if/while/for и т.д.)
Что означает успешно прошли все предыдущие записи: это означает, что всё было записано как и хотелось, но не сообщает, пустой ли буфер cin. Если хочешь проверить на то, пустой ли он, то включай проверку cin.eof() -- обязательно пустые скобки в конце, т.к. это вызов булевой функции без аргументов.
(cin) означает, что все предыдущие записи были успешны (или ты очистили этот флаг)
(cin.eof()) означает END OF FILE (пустой буфер потока cin)
>>626953
>Если в предыдущей строчке cin не распарсил входные данные.
Необязательно последней.
Разобрался уже. И дополнительно в stl' битсет.
Нужно было флаги реализовать.
Где загрузить исходники STL? Нашел http://llvm.org/svn/llvm-project/libcxx/trunk/ , но стащить их не очень выходит.
Гугли STLport, EASTL, RDESTL.
наоборот, юзаешь sslStream.next_layer() пока делаешь незащищенное, а потом переползаешь в защищенное
Проблема в том, что мне может быть нужно нешифрованное соединение без SSL вообще. Получается, что придётся инициализировать SSL (boost::asio::ssl::context, boost::asio::ssl::stream), получить заголовок от клиента и, если нет запроса на SSL, работать с next_layer(). Неужели нет возможности сделать по другому?
Использовать человеческую I/O библиотеку, а не это тормозное overarchitectured9000 говно.
Посмотрел пару часов в эту огромную кодобазу, иерархия инклудов перестала помещаться на втором мониторе, я закрыл.
Как у людей выходит понимать все это, отсылать по 5 патчей в день и не сходить с ума?
С какой стороны подходить вообще к таким огромным репозиториям? Или без ста грамм нихуя не поймешь и по-любому придется сквозь тернии к звездам?
>по 5 патчей в день
Батя кстати все время какие-то доки читает, чтобы пулл-реквесты делать часто, контрибутит по 5 раз в день, а потом говорит, что репозиторий на диск не влезает, и еще форкает он. Пиздец короче. Реальная история, я не шароварщик.
Вероятно, и эта библиотека хороша, но мне надо тренироваться на бусте.
Что-то буст начинает меня расстраивать, хотя и начал изучать его совсем недавно. Тысячи конструкторов на любую ситуацию, миллион функций для любого случая, а такую простую вещь, как сокет невозможно передать через конструктор или заменить через метод. Забавно, но неужели ни у кого из пользователей/разработчиков не было необходимости в реализации прокси? Так и пришлось создавать boost::asio::ssl::context и boost::asio::ssl::stream и, в зависимости от заголовка, использовать либо SSL, либо через socket.next_layer() получать сокет и работать уже с ним. Хорошо, что хотя бы к внутренним данным доступ есть.
Дык из-за этого на нем даже ни одного нормального вебсервера нету (где-то были бенчмарки, где бустовый.асио Goвну слил).
Тебе уде говорили: если нужна именно вот такая низкоуровенная хуитка - забей на буст.
Буст неоднороден, я уже который раз об этом втираю ньюфагам ИТТ. Его писали разные люди, на протяжение почти 15 лет уже. И когда написали хуйню, от нее уже нельзя отказаться, приходится поддерживать. Поэтому там есть годнейшие вещи треды, умные указатели, chrono, которые постепенно перекочевывают в стандарт. Есть просто хорошие пулы всякие, any/variant. Есть сложные и узкоспециализированные spirit, MPL, они быстро устаревают, но стабильны и все еще могут дать прикурить standalone-аналогам. Есть громоздкие части для популярных задач filesystem, test, они обычно хуже, чем standalone-аналоги, но не сильно, зато позволяют не прикручивать ничего, кроме буста. А есть всякий шлак, который неудачно впилили, и теперь выпилить уже не могут, а нормальный аналог пихать не хотят, потому что перекрытие зон ответственности, и вообще ВСЕ УЖЕ НАПИСАНО. asio - типичный пример такого говна, которое трогать не стоит, только понюхать, поморщиться и найти нормальную либу.
Плюсогоспода, поясните вот что. Уходят ли кресты постепенно в легаси? В каких проектах они теряют популярность, а в каких - набирают?
Например, не станут ли через пару лет весь GUI делать на чём-то более лёгком в освоении, чем плюсы+Qt? Вон даже Microsoft в какой-то VS ограничил поддержку плюсов, чтобы на решётку перешли. Если есть какие-нибудь хорошие статьи 2015-2016 годов, поясняющие области применения C++ и то, откуда он не собирается уходить, с удовольствием почитал бы. Ну и ваше мнение интересно, разумеется. Заранее спасибо.
Просто есть пару свободных месяцев - думаю либо в плюсы нормально вкатиться, либо вкатиться в решётки или вообще в джаву.
>на чём-то более лёгком в освоении, чем плюсы+Qt
Его и для плюсов уже на QML пишут (для лёгкого софта там и плюсов не надо).
> области применения C++ и то, откуда он не собирается уходить
Чо там статьи-то писать.
Легаси в: десктопных хуитках, автоматизации, всякой сайнс-хуйне, энтерпрайз и пр. где скорость разработки стоит выше производительности;
Не собирается двигаться из: игрулек (конкретно - движков), системщины и всякого эмбедеда (сюда только вкатывается, лол), всякого супер-хуйлода вроде поисковика гугла, короче говоря везде, где главное - производительность.
Хуёвая затея. Если нюфаг - даже не смотри в сторону плюсов, конкретно становление как программиста они только замедляют.
>ограничил поддержку плюсов
>запилили фичи из семнадцатого стандарта
>добавили поддержку clang
>крестовые апдейты чаще, чем твоя мамаша дает в очко
Ну окей, че.
Я кстати после крестов пытался питон выучить недавно начал. Там полный пиздец с пониманием. Может говноскрипты писать и научишься, но программировать вряд ли. Там сразу ООП и совсем нелогичная или не оптимизированная архитектура. Там меняется тип переменных в ходе работы программы. С первых минут в глаза бросается вся хуйня из-за которой он будет тормозить. Поэтому для ньюфагов наверно лучше паскаль какой-нибудь, а не эту хуету которую обычно советуют.
Ты им пользовался вообще? Понимание его архитектуры начинается после понимания принципов использования.
Хули там понимать? Хочешь вектор - берешь кулист, хочешь строку - берешь кустроку.
Суть всяких питонов в обучении - без ебли можно реализовывать разные алгоритмы, двигаться в этом направлении хоть как-то. Я в своё время был упрямым школьником начал с плюсов, и плюсов сего действа сейчас не вижу.
Насчёт паскаля ты вообще прав, надо модеру пизды дать чтобы из шапки строку про "Рабе/петон для нюфань" убрал.
>без ебли можно реализовывать разные алгоритмы
там при обучении по началу многое не поясняют т.к. слишком много всякой хуеты. Я пока даже не понял как там ввод вывод работает.
>надо модеру пизды дать чтобы из шапки строку про "Рабе/петон для нюфань" убрал.
Щас вроде новый. Он добрый не считая предупреждений за скобочки))))) и отзывчивый. Скорее всего прислушаемся. А вообще пора новую шапку для прикреплёного треда пилить всем программачем. Или может сначала крестоёбскую доделаем?
Здесь, дорогие друзья, мы с вами можем наблюдать, как детеныш Gallus Static, заботливо выращенный в теплом и уютном вольере, впервые столкнулся с диким и опасным миром динамической типизации.
А что у бэйсика?
>Рабе/петон для нюфань
Я насчет Ruby и сам не оче согласен, но не хочу игнорировать труд предшественника. Пусть у него вся лента из "руби, скалы и еще какой-то хуйни", человек старался же, собирал материалы. Не мной покладено, не мне и дадено, такие дела. К тому же, я бы для начального обучения алгоритмизации выбрал питон, а не паскаль, ибо вред от отсутствия жесткого контроля за ньюфагом с лихвой компенсируется живостью языка и на порядок более высоким уровнем абстракции. ИМХО.
>>628340
Я только за. Если анон захочет допилить прикрепленный тред, с удовольствием все добавлю. Алсо, можете создать тред для обсуждения всего этого. Если анон проявит желание и начнется движуха, то можно будет прикрепить его, или сделать голосовалку, или еще что-то.
> труд предшественника
Того долбаёба который ссылки на треды про ЯП по пол года не обновлял?
У него ещё есть админка?
>Я только за.
https://2ch.hk/pr/res/628387.html (М)
Ага, брать кулист вместо няшного кувектора.
>>628314
>>628312
Знаю сишку на довольно неплохом уровне, могу в микроконтроллеры на сишке, могу в приличный код, но по части ООП и мультитрединга новичок. Знаю плюсы на уровне теории (прослушал курс в универе, лол) и пары лаб, но не практиковался пока в STL и разных shared_ptr и прочих тонкостях, которые, как я понял, необходимы. Рефакторил немного один проект на плюсах, офигел от паттернов.
>>628312
Про Qt - довольно логично, ибо плюсы в GUI как-то непонятно даже, зачем. А почему в энтерпрайзе он легаси? В эмбеддед пока не собираются завозить джаву? Сложно ли вкатиться в такие серьёзные проекты? Что обычно нужно знать, кроме стандартных вещей вроде ООП и мультитрединга? Работы вообще много в мире, или на плюсовиков спрос ограничен, как на админов?
>>628317
Вроде бы, Intellisense там теперь не такой интеллигентный, как прежде, в отличии от шарпа. Сам не смотрел, но слова анона, который об этом сообщил, насторожили.
Помидоры скачай, хули как маленький.
Для хуйни нужен секундомер.
Ну я короч велосипед с second++ пилить не стал, взял qtime
Тут такая хуйня, доки говорят что:
addSecs()
Returns a QDateTime object containing a datetime s seconds later than the datetime of this object (or earlier if s is negative).
(вольная копипаста, суть передана)
И, собственно, добавить секунду в QTime stopwatch у меня получилось только так:
QTime temp = stopwatch->addSecs(1);
*stopwatch = temp;
Это нормально или полный пиздец и можно проще?
Да, долбоеб, додумался до
*stopwatch = stopwatch->addSecs(1);
но все равно мне это кажется костылем
Хорошо, благодарю.
Если честно, сам немного жалею что такой диплом брал, еще и на qt. Лучше бы простое "проектирование"
Вроде все правильно сделал, но в io не совсем по порядку оно все.
Можете советов дельных дать, что можно переделать?
Производитель потребитель задача.
int i, j;
float sum = 0;
int num = 100000000;
for( i = 0; i < num; i++ )
{
for( j = 0; j < num; j++ )
{
float x = myDataX;
float y = myDataY[j];
float value = x+y;
sum+=value;
}
}
Кроме как вынести
float x = myDataX;
из вложеного цикла ничего в голову не приходит. Подскажи Анон?
int i, j;
float sum = 0;
int num = 100000000;
for( i = 0; i < num; i++ )
{
for( j = 0; j < num; j++ )
{
float x = myDataX;
float y = myDataY[j];
float value = x+y;
sum+=value;
}
}
быстрофикс
Ну, что ты хотел, милаш?
Во-первых неясно зачем тебе переменные x, y и value. Во-вторых тебе достаточно сумму первого массива умножить на 100000000 и прибавить к ней сумму второго массива умноженую на 100000000 ^ 2.
"Деструктор анального писюна, псалма 14 параграф 88 лука"
Где достать это говно? Как часто оно обновляется?
open-std.org Обновляется, 98, 2003, 2011, 2014, и будет вроде 2017. Важные обновления - 98 и 2011, а промежуточные - багфиксы по сути.
оно тебе не нужно, сын мой
>>629600
>>629598
>>629596
какая-то хуйня написана
у тебя myDataX и myDataY не зависят от одного из циклов
короче получается так:
sum = (std::accumulate(myDataX, myDataX + num, 0f) + std::accumulate(myDataY, myDataY + num, 0f)) * num;
либо распиши что там у тебя вместо "float value = x+y;"
Нужно.
Оно есть в шапке этого треда же.
кусок кода из тестового задания, где надо его оптимизировать
вот программа для теста (переменную num я уменьшил) результат в ней: 998540800
http://pastebin.com/XesqpaGR
если суммировать элементы и множить потом на размер, как здесь:
sum = (std::accumulate(myDataX, myDataX + num, 0.f) + std::accumulate(myDataY, myDataY + num, 0.f)) * num;
результат получается: 999000000
>кусок кода из тестового задания, где >надо его оптимизировать
Это я к тому что понятия не имею чего хотел автор достичь переменными x, y, value
> если суммировать элементы и множить потом на размер, как здесь:
А здесь все ок https://ideone.com/NMaxiV
В гугле на русском ничего, кроме одной книжки. Что делать ?
Нахуя оно тебе надо?
Буст или графы ? Годная штука, много фич.
>posix
Кстати что это? Вики прочитал, но нихуя не понял. А выглядит интересно. Если нуфаг, то можно для него какую-нибудь хуету написать? Реквестирую книгу.
>Кстати что это? Вики прочитал, но нихуя не понял.
Стандарт.
>А выглядит интересно
Выглядит как unix way c-only.
Для философов тебе мьютексов хватит же. Пока используешь любую вилку - блокируешь конкретно ее мьютексом. Дальше просто нумеруешь вилки и берешь всегда по возрастанию номеров.
>А ты не врешь?
if ((sem_id = semget (ipc_key, 2, IPC_CREAT | IPC_EXCL |0600)) <0)
semctl (sem_id, 1, SETVAL, 1);
Не туда смотришь. У Qt свой дух, весьма вонючий. Либо используешь Qt Creator, либо студию с нормальными библиотеками FLTK или wxWidgets там, если любишь помощнее и посложнее. Не надо мешать вино с пивом, блджад.
Хочу что-нибудь напердолить на кутешечке, но ума не приложу, что.
>Хочу что-нибудь напердолить на кутешечке, но ума не приложу, что
Визуализацию случайного блуждания с отражением.
У меня любой день одинаков.
Тут индивиды любят пояснять что кутя нинужна, как и цпп - фве работает на гэтэкаплас и си.
>гэтэкаплас
инфернальное говнище, почти полное повторение цепепе аби без использования слов цепепе
на выходе тонны говномакросов, которые делают абсолютно тоже самое что и плюсы внутрях
Будешь каждого дауна слушать - так и будешь думать, что X не нужен, а на Y работы нет.
Давай, расскажи, как ты удачно впихнул string и QString в одно приложение.
Но зачем мне это делать? В Qt свои контейнеры, зачем мне там нужен stl?
Патамушта. Ты. Должин. !!!
Ведь ооп придумали не для разделения кода, видимо НИЛЬЗЯ разделять кодобазу на stl и qt.
Ты кто вообще такой и что мне от тебя надо? Свяжешься с моим секретарем.
А нахуя тебе алгоритмы в гуе? Или ты не умеешь отделять логику от представления? Это уже к тебе вопрос тогда, лолка.
Не понел, qstring можно сконструировать из потока байт в любой кодировке, не понимаю проблемы.
Еблан тупой, Qt-контейнеры stl-совместимые. Сложно в хелп слазить, посмотреть?
Cначала нихуя не понял
потом тоже
>А нахуя тебе алгоритмы в гуе?
Вот вся суть кутеблядков в одном предложении. Сначала пихают везде свои нестандартные велосипеды в духе QYourMomma, а потом проект оказывается склепан из stl, qt и Аллаха в каждом файле и адаптеров к адаптерам, как ебаный монстр Франкенштейна.
Хуйню спизданул и рад.
Даже обоссывать тебя лень, дегенерат тупой.
http://doc.qt.io/qt-4.8/containers.html#stl-style-iterators
>STL-style iterators have been available since the release of Qt 2.0. They are compatible with Qt's and STL's generic algorithms and are optimized for speed.
>Qt-контейнеры stl-совместимые
Глядите, маняманевры пошли. Ты разницу между совместимостью с STL и совместимостью с алгоритмами STL ощущаешь, чепуш? Охуеть просто, я напишу пустую заглушку с интерфейсом итератора, буду ее возвращать и кукарекать о совместимости с STL, а пацаны-то не знали.
Что ты вкладываешь в понятие "совместимость с STL" дауна ты кусок? Скажи, зачем вот это вот суетливое маняврирование про неработающие самописные итераторы? Конечно, если их написать чтобы они не работали, то они работать не будут, то же мне сюрприз. Вот только те которые сейчас в Qt есть - они работают, и можно при помощи std::sort сортировать QVector или там при помощи std::find_if что-то в нем искать. Какая тебе еще совместимость с STL нужна, дегенератина ты тупая?
Пока не раскурил <atomic> и <future>. Понять не могу, везде кукарекают, что надо lock-free, lock-free; нахуй тогда вообще в таком случае нужны мутексы и локи и хуёки, если можно все ебашить ЛОК ФРИ?!
Я серьезно не понимаю, объясните, если кто осведомлён.
Ну как ньюфагу, ньюфагу в паралеллизме на стандарте.
потому что нельзя абсолютно всё заебашить локфри
зато там, где можно, есть ч0ткий рост скорости
Что именно нельзя, можешь немного конкретизировать? За пеленой абстракции не воспринимается разница.
Ты наркоман штоле, сука? stl-совместимый контейнер = контейнер с интерфейсом, идентичным контейнерам stl. Ты можешь использовать объекты QVector вместо объектов std::vector без перепила клиента? Нет. О какой тогда совместимости ты кукарекаешь, маня?
В другом, разумеется, в этом вся суть PIMPL. В книжках называют TvoyaMamkaImpl, но я обычно сразу делаю все классы имплементациями, используя родные имена. Если надо PIMPL, использую специальную шаблонную обертку с джвумя хэдерами. Если интересно, могу пояснить подробнее за принцип.
Но нахуя?
У мэйерса в том же, и http://c2.com/cgi/wiki?PimplIdiom здесь
в том же файле - имел ввиду .cpp а не .hpp, может ты неправильно меня понял
Все сказал?
съеби в дэ тред
>Ты можешь использовать объекты QVector вместо объектов std::vector без перепила клиента?
Да могу, большинство методов std::vector продублированы в QVector. Я ж советовал тебе хелп посмотреть, хули ты этого еще не сделал?
Лол, так у Мейерса это просто иллюстрация, а не реальное использование. Чтобы можно было скопипастить и скомпилировать. Это как с using namespace std - удобно писать примеры, но реально так не делают.
Первоочередная задача PIMPL - ускорение компиляции. Допустим, ты хочешь завести в классе YourBatya член-экземпляр класса Trukhany. Тогда компилятору нужен размер труханов, т.е. внутри файла с классом бати это должен быть т.н. complete type. Поэтому ты делаешь #include <Trukhany.h>
Хэдер с труханами большой, а у бати есть еще три экземпляра Grass и экземпляр FartFactory, а у их хэдеров есть свои зависимости и инклуды... Получается, что после вставки всех хэдеров батин файл становится неебического размера. И такое происходит почти с каждым классом, у которого есть зависимости, поэтому компилятор тратит очень много времени на многократный парсинг всего этого дерьма, как только какой-то из хэдеров изменяется.
Вот чтобы такого не было, используют PIMPL. Вместо инклуда пишут просто объявление, что есть такой class Trukhany, а что это за класс - батин хэдер не ебет, потому что при использовании PIMPL экземпляр хранится по указателю, а все методы, которым уже надо знать про внутренности труханов, вынесены в батин .cpp. Таким образом, при изменении Trukhany.h придется перекомпилировать только .cpp-шники, которых не так много, а не рекурсивно большую часть проекта.
Вообще, PIMPL используется не только для этого (например, в паттернах наподобие Bridge, по сути, тоже PIMPL, но там акцент на возможность заменить имплементацию в рантайме, поэтому часто "имплементацию по умолчанию" размещают рядом), но самый часто используемый и существенный эффект - именно с выносом в другой файл.
std::vector <int, std::allocator <int>> v {};
Вот тебе тело функции из одной строчки. Заменяешь vector на QVector, пробуешь скомпилировать, обретаешь просветление.
Ты щас описал то что у мэйерса.
Какой прикол выделять реализацию в другой файл ( НЕ БАТЯ.cpp ) - ты так и не написал.
Тогда линуксовый файл или ассемблер показывай.
Пикрелейтед два подхода. Вопрос скорости компиляции решают оба, но правый более гибкий и связанность меньше.
Профит в том, что firewall_* пишутся один раз и потом их можно использовать с любыми классами. Когда ты пишешь батю, ты не думаешь про способ его использования, просто пишешь обычный класс. Захотел сделать для него PIMPL - правишь только клиент (мамку). Принцип единственной обязанности же.
Ну окей.
>Первоочередная задача PIMPL - ускорение компиляции
блядь, что ты несешь?? кто сейчас заморачивается скоростью компиляции??
PIMPL нужен для библиотек, чтобы можно было бы менять внутренности скрытого класса, не ломая ABI
>Вместо инклуда пишут просто объявление, что есть такой class Trukhany
бляяяяяядь, это всего лишь forward declaration, а не PIMPL
Кстати, я вот хотел ему сказать за эту статейку и за fragile binary interfaces, но разве одно отменяет другое? Быстрая компиляция действительно имеет место.
• The Pimpl Idiom decreases build times by reducing compilation dependencies
between class clients and class implementations.
У Мэйерса вот написано про время компиляции.
А он тоже не хуй с горы, как бы.
К примеру, хочу сделать так, чтобы у меня файл читался и выводился на экран, но чтобы при этом чтение файла было в соседнем классе.
Т.е.
Файл 1.cpp должен пользовать файл 2.cpp чтобы вызвать функцию открытия файла.
А файл 2.cpp должен заюзать 1.cpp чтобы вывести это дело на экран. Данных предполагается много, поэтому return (переменная с дохуя текста), не хотелось бы юзать.
Подключать "друг в друга" мечта /b компилятор, естестна не дает
> решил писать свой костыль
> надо прочитать файл, и потом на основе его раскидать параметры в файле
Я слышал из крестов можно консольные команды выполнять. А из консоли перл программки. А перл как раз сделан чтобы такие проблемы решать.
Я бы использовал хаскель.
Передавай частями. Тоесть 1.cpp хочет отобразить файл, он создает объект 2.cpp, передает уме себя как делегата (или кого-то специально обученого быть делегатом). 2.срр читает файл, и каждые n байт отдает делегату. Еще можно просто общий буфер использовать, но там по-моему больше нюансов всплывает.
Первое и основное - прочитал джва раза, понял что ничего не понял.
Второе - оно как-то странно раскидывает конфиги - в винде в реестр, в линухах - в ini. Хотя видел упоминание второго режима. Но тут вступает первый пункт в игру.
>>631278
Мокропиську для работы под себя, чтобы удобней было.
>>631280
Хотел бы рискнуть, но мне бы работающую версию поживее. Да и опять же, помимо qt нужно будет и перл тянуть сверху (предполагается помимо как на линухах и на винде пользовать еще)
Я только вкатился (не профессия, решил себе жизнь упростить прост, поебавшись много и заранее), поэтому для меня это пока... сложновато.
https://arhivach.org/thread/135285/#618203
Ну кусеттингс его не устроил же.
Это нормально.
В целом да, unique_ptr позволяет. Есть такой нюанс, что для безопасности лучше не использовать голый unique_ptr, потому что там может быть nullptr, или, к примеру, кто-то может внезапно заменить объект. Удобнее всего сделать класс у меня это firewall, который содержит unique_ptr и самостоятельно инициализирует указатель, а после создания гарантирует, что его никто не изменит. Поэтому и надо разделение на decl и def - деструктору и конструктору нужна полная инфа о бате, поэтому def включается уже в .cpp, когда это известно.
Лол, те же яйца, только в профиль.
На выхлопе ты изобретешь кусеттингс, понимаешь, где ты себя наебал?
В дишке есть function и есть delegate.
Разница в том, что function видит только свои параметры, а делегат может видеть то, что снаружи.
То есть, std::function, которая чего то снаружи захватывает - и есть делегат.
Я понимаю твой настрой.
Но прошу учитывать мою зеленость и твой укор - для меня тоже новая информация.
Также меня смутила эта статья: http://habrahabr.ru/post/149085/ хоть я и понимаю, что там для меня ничего полезного (на данном этапе)
Спасибо.
>кто сейчас заморачивается скоростью компиляции?
Пару тредов назад была ссылка на презентацию команды яндекс-браузера. У них он компилировался "два часа на хорошем макбуке". Ты не с ними работаешь, часом?
>чтобы можно было бы менять внутренности скрытого класса
Это одно и то же, лол. В случае библиотек просто цена выше - придется перекомпилировать не половину проекта, а все проекты, юзающие библиотеку.
>это всего лишь forward declaration
Ну. В PIMPL-обертке же есть указатель на имплементацию, поэтому требуется forward declaration, иначе не скомпилируется.
Блин.
This technique is described in Design Patterns as the Bridge pattern. It is sometimes referred to as "handle classes",the "Pimpl idiom" (for "pointer to implementation idiom"),"Compiler firewall idiom", "d-pointer" or "Cheshire Cat", especially among the C++ community.
Почему чеширский кот и d-ptr? Особенно д, в Qt сырцах ввеееезде d, что он символизирует?
Вряд ли я оттуда это спиздил. ЕМНИП, я выработал такой подход на основе Мейерса, когда хотел повторно использовать эту хуйню.
Ну так это уже частный случай, лол.
В чистом пимпле это не нужно, нужна скорость компиляции и скрытие от пользователя.
А то что можно многоразово юзать - это уже фишечка. Отталкиваться нужно от ситуации, ящитаю. Если нету бати и мамки - то зачем плодить еще два файла :)
Да. Суть в том, что надо баланс между повторным использованием и специализированностью к твоей задаче. PIMPL можно сделать по-разному, и вообще граница между ним и другими подходами с внедрениям зависимости оче размыта. Можно каждый раз делать два класса, форвардить методы и получать PIMPL с идентичным интерфейсом. Или вынести только часть методов. А я зделал упор на повторное использование, но ценой некоторого фиксирования конкретной реализации.
Во-во, именно, баланс исходя из ситуации.
Ну, это вообще дело вкуса же. Мне кажется, не стоит в шапке перечислять все существующие иде, тем более, что на вкус и цвет... Я руководствовался тем, что надо предоставить наиболее дружелюбные ньюфагу варианты, а важнейшим фактором является автодополнение и ебля при установке. Автодополнение объективно лучшее у студии, а среди остальных - у codelite, ебля с обеими умеренная, вместе они покрывают все три оси. Поэтому не стоит менять их на что-то другое без причины, ящитаю.
Литературу как раз сейчас смотрю, возможно, успею что-то впилить уже в этом перекате.
Но может ведь, если делать.
Короче, я понимаю делегат как функцию, которую можно запихнуть в функцию высшего порядка.
Чеширский кот потому что типа видно только улыбку-обертку, как в сказке про Алису. Алсо, там много разных названий и много разных деталей. Я стараюсь как-то систематизировать это, а не мешать в кучу. Конкретно под мостом у банды подразумевался случай с немного другой мотивацией - разделением иерархий интерфейсов и реализаций, чтобы не плодить классы. А у Скотта pimpl решает именно проблему скорости компиляции, поэтому я обычно различаю эти понятия. Но вообще это просто вопрос терминологии, можно и не заморачиваться.
Вики вообще говорит, что делегат это "безопасный указатель на функцию". Зачем, кстати, тянуть в кресты лишнее понятие из шарпа? Есть лямбды, есть функторы, есть function wrappers, хуле еще надо?
Разве это не абстрактное, не зависящее от языка понятие?
Да и сабж в крестах появился недавно, лет 5 назад всего. Всякие бусты не смотрел.
Также отдельное спасибо анону, посоветовавшему JSON, т.к. он натолкнул меня на реализацию пары полезных фич с помощью этого дела.
Всем доброго времени суток.
>>631269-кун
Ну вот :3 Хули там, записать-прочитать, группу открыть-закрыть, сохранить, открыть.
Еще работу по ним найти.
Зачастую да, но вообще это совершенно разные вещи, так что не обязательно. Например, может быть pimpl без разделения (если impl - конкретный класс без наследования от абстрактного интерфейса, то так и есть: сменить его в рантайме не получится, но зато работает немного быстрее без виртуальности), а может быть разделение без pimpl (когда в силу легкости абстрактный интерфейс отделенной части инклудят сразу, чтобы иметь возможность звать его методы прямо из хэдера).
Огромнейший фреймворк, можно велосипед написать и не быть в курсе, что это говно уже запилено.
Куча макросов, хуякросов, куэмель, хуеэмель - как это все помнить?
Написание любой хуйни с нуля заканчивается переполнением стека мозга в поиске в глубину.
Элементарно. Когда тебе что то нужно - ищешь это в составе Qt и из хуень оттуда, как из кирпичиков, херачишь прогу.
А там есть практически все.
Ага.
А потом оказывается, что тебе нужно все перепиливать, потому что хуйнянейм работает по-другому.
Ну и что такого. Суть погромирования - постоянно что то перепиливать. В мире постоянно меняющихся хуйнянеймов.
Это я туплю уже. Сорян.
лог ошибки для фреймвока:
OS Version = 6.3.9600, SP = 0.0, Platform 2
OS Description = Win81 - x64 Enterprise Edition
MSI = 5.0.9600.17905
Windows servicing = 6.3.9600.17709
CommandLine = D:\9b9e4e20fea3f3ccdd3319a1\\Setup.exe /x86 /x64 /redist
Using Simultaneous Download and Install mechanism
Operation: Installing
Package Name = Microsoft .NET Framework 4.6.1 Setup
Package Version = 4.6.01055
User Experience Data Collection Policy: AlwaysUploaded
Number of applicable items: 6
RmShutdown failed with error: 351
RmShutdown failed with error: 351
Exe (D:\9b9e4e20fea3f3ccdd3319a1\SetupUtility.exe) succeeded.
Exe Log File: dd_SetupUtility.txt
Exe (D:\9b9e4e20fea3f3ccdd3319a1\SetupUtility.exe) succeeded.
Exe Log File: dd_SetupUtility.txt
Exe (D:\9b9e4e20fea3f3ccdd3319a1\x64-Windows8.1-KB3102467-x64.cab) failed with 0x490 - Element not found. .
Final Result: Installation failed with error code: (0x00000490), "Element not found. " (Elapsed time: 0 00:04:12).
>x64-Windows8.1-KB3102467-x64.cab) failed with 0x490 - Element not found
Ну очевидно же, что надо поставить эту обнову вручную. Найди ее в центре обновления или скачай у мелкомягких с сайта.
><устарело> Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004)
Котаны, насколько устарело? У меня издание 2006 года (4е издание). Легко читается. Есть ли смысл учить по этой книге а потом добрать знаний по новшествам либо лучше сразу брать новую кригу? эта в бумажном варианте, а читать с монитора ну совсем не круто
При этом паралельно смотрю разные видео на тытрубе, кстати.
Вот вы мне поясните, почему, если С++ так охуенен, в перепись треде все нормальные зарплаты у тех кто пишет на php и JS а с плюсами там всего пара человек???
Вы видите копию треда, сохраненную 31 января 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.