Dyzzet|
C++
Data Science Алгоритмы Темы · Блог · YouTube · Telegram
Обзоры книг по C++. Что выбрать? (Обновляется)

Б. Страуструп. Язык программирования C++. Краткий курс

Б. Страуструп. Дизайн и эволюция C++

С. Липпман, Ж. Лажойе, Б. Му. Язык программирования C++. Базовый курс

Сиддхартха Рао. Освой самостоятельно C++ по одному часу в день

Если вы предпочитаете первоисточник, то вам подойдёт книга Бьерна Страуструпа «Язык программирования C++. Краткий курс» (2019), самая человечная из его книг. Если вы уже хорошо изучили язык, вам может понравиться книга «Дизайн и эволюция C++» (оригинал 1994 года), хотя она и не несёт практической пользы.

Авторы Стенли Б. Липпман, Жози Лажойе, Барбара Э. Му написали хорошую книгу «Язык программирования C++. Базовый курс» (2014), которая не только переиздаётся, но и обновляется. С. Липпман и Б. Му принимали участие в стандартизации языка.

На удивление хорошей оказалась книга Сиддхартхи Рао «Освой самостоятельно C++ по одному часу в день» (2017).

Книга Майкла Доусона «Изучаем C++ через программирование игр» (2016) может послужить стимулом для начинающих разработчиков.

Читать далее →
26 августа
По крайней мере, я называю список списком

Alexander Stepanov. Spoils of the Egyptians. Lecture 2. Part 2

Правило, которое нам нужно в какой-то степени... навязать себе. Мы должны раз и навсегда решить, что будем придерживаться установленной терминологии. И позвольте мне сказать вам. Прямо перед вами — вы видите одного из худших нарушителей этого правила. Я про себя, не про вас. Почему так вышло? И я не горжусь этим. Мне очень стыдно за одну вещь. Некоторые из вас могут знать, что я создал STL. Некоторые из вас даже могут использовать STL. Если так, то, скорее всего, вы используете класс, который называется?.. Какой класс вы используете? vector! vector, вы используете vector. Так вот... это очень позорный факт — эти векторы не имеют ничего общего с векторами, которые я знал и любил всю свою жизнь. Они не находятся в векторном пространстве. Объекты в векторном пространстве не увеличивают свою размерность и не уменьшают. Они сохраняют размерность. И они не бывают произвольного типа; они все связаны с полями. И у вас есть операции, такие как скалярное произведение и многие другие замечательные вещи. Вот их называют векторами.

Так давайте обдумаем, что же произошло. Бредил ли я? Нет, нет, на самом деле не бредил. Я думал, что делаю всё правильно. Когда я вводил этот термин в C++, моя логика была такова: я должен быть скромнее и не выдумывать новый термин. Я должен использовать общеизвестные термины. Поэтому я решил посмотреть, как это называется в языках Common Lisp и Scheme. И что я сделал? Предпочёл сообщество из 50 человек, а не сообщество из пяти миллионов. Я следовал примеру какого-то очень маленького, переходного сообщества. Сообщество Scheme мёртво. В MIT сейчас учат языку Python.

Но мы навсегда застряли в этой ситуации с векторами. Опять же, ошибки, которые вы совершаете, очень трудно исправить. Мы должны быть весьма осторожными, когда используем термины, мы должны использовать их точно. В конечном итоге я ссылаюсь на статью Айверсона под названием «Нотация — это инструмент мышления» (Notation Is A Tool of Thought). Но раньше нотации идёт язык как инструмент мышления. Мы должны быть очень-очень осторожными в использовании языка и должны использовать общеизвестные термины. Мы не должны использовать термины для обозначения того, чем они не являются. Сделал ли я так? Да, я только что публично признался. Если бы тут был пепел, я бы посыпал им голову, но пепла не предоставили. Так что, знаете, я не могу этого сделать. Я имею в виду, вы должны быть очень-очень осторожными. По крайней мере, я называю список списком, в отличие от языка Python (аудитория смеётся).

Александр Степанов. Трофеи египтян

Читать далее →
18 марта
Обзоры книг по C++. Парадигмы, идиомы, шаблоны проектирования

Андрей Александреску. Современное проектирование на C++. Обобщённое программирование и прикладные шаблоны проектирования

336 страниц. Вильямс, 2002

Andrei Alexandrescu. Modern C++ Design: Generic Programming and Design Patterns. Addison-Wesley, 2001

Андрей Александреску — соавтор языка D.

Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приёмы объектно-ориентированного проектирования, оригинал 1995 года

Книгу открывают предисловия Скотта Мейерса и Джона Влиссидеса (соавтора знаменитой книги о шаблонах проектирования от «банды четырёх»).

Материал, безусловно, сложный. Это то, что называют шаблонной магией. Автор показывает устройство библиотеки Loki. Хотя всё подробно описывается, читатель должен уже быть хорошо подготовлен.

К сожалению, в русском переводе есть опечатки в коде и ошибки в терминах: copy constructor, то есть конструктор копирования, в одном месте перевели непонятно как; некоторые термины на момент перевода ещё не устоялись в русском языке; так, frameworks перевели как специальные среды разработки (но в скобках даётся оригинал, так что можно понять).

Читать далее →
17 ноября 2024
Обзоры книг по C++. Советы и задачи по языку

Курт Гантерот. Оптимизация программ на C++. Проверенные методы для повышения произ­во­ди­тельности

400 страниц. Альфа-книга, 2017

Kurt Guntheroth. Optimized C++. Proven Techniques for Heightened Performance. O’Reilly, 2016

«Приветствую вас! Меня зовут Курт, и я кодоголик».

Подход обстоятельный. В начале книги описывается закон Амдала — улучшение времени выполнения \(S_T\):

\(S_T = \dfrac{1}{(1-P)+\frac{P}{S_p}}\),

где \(P\) — доля оптимизированного общего времени выполнения, \(S_p\) — показатель улучшения в оптимизированной части \(P\). Например, если некоторая функция выполнялась 80 процентов всего времени работы программы, а улучшенная её версия стала работать на 30 процентов быстрее, иначе говоря, \(P=0{,}8\), \(S_p=1{,}3\), то \(S_T\approx 1{,}22\).

Глава «Оптимизация, влияющая на поведение компьютера» — очерк того, с какими абстракциями аппаратного и программного обеспечения приходится иметь дело. Большая часть тем — это последовательное улучшение некоторого базового примера.

Читать далее →
4 октября 2024
Обзоры книг по C++. Boost

Boost — огромный набор библиотек.

Онлайн-примеры кода из книги, которые можно изменять и запускать

Антон Полухин. Разработка приложений на C++ с использованием Boost

346 страниц. ДМК Пресс, 2020

Antony Polukhin. Boost C++ Application Development Cookbook. Packt, 2013

Антон Полухин — автор нескольких библиотек Boost, поддерживает ряд старых библиотек и сейчас представляет Россию в международном комитете по стандартизации C++.

Оглавление:

  1. Приступаем к написанию приложения
  2. Управление ресурсами
  3. Преобразование и приведение
  4. Уловки времени компиляции
  5. Многопоточность
  6. Манипулирование задачами
  7. Манипулирование строками
  8. Метапрограммирование
  9. Контейнеры
  10. Сбор информации о платформе и компиляторе
  11. Работа с системой
  12. Касаясь верхушки айсберга

Последняя глава посвящена графам, генератору истинно случайных чисел, переносимым математическим функциям, объединению нескольких тестовых случаев в одном тестовом модуле и манипулированию изображениями.

$ ./our_program.exe --apples=10 --oranges=20
Fruits count: 30

Какие-то вещи уже устарели, потому что стали частью стандарта, например, Boost.Any, Boost.Variant, Boost.Optional, Boost.Tuple, Boost.Bind, Boost.Move (семантика перемещения до C++11), Boost.SmartPtr, Boost.Function. Какие-то вещи просто любопытны. Как, например, имитация finally из языка Java. Полезных вещей в книге можно подсмотреть много, скажем, синтаксический анализ (parsing) сложного ввода с помощью Boost.Spirit. Там используется расширенная форма Бэкуса — Наура (РБНФ, Extended Backus–Naur Form; EBNF).

const bool success = boost::spirit::qi::parse(first, end,
    u4_[y] >> char_('-') >> u2_[m] >> char_('-') >> u2_[d]
);

Книга рассказывает о многих вещах, но довольно поверхностно. Но как ознакомительный обзор вполне годится.

Дэвид Р. Мюссер, Жилмер Дж. Дердж, Атул Сейни. C++ и STL: справочное руководство (2010, оригинал 2001)

Джереми Сик, Лай-Кван Ли, Эндрю Ламсдэйн. C++ Boost Graph Library

304 страницы. Питер, 2006

Jeremy G. Siek, Lie-Quan Lee, Andrew Lumsdaine. The Boost Graph Library. Addison-Wesley, 2002

Книга по довольно сложной части библиотеки Boost — графовой библиотеке.

Часть I — основные алгоритмы, поиск кратчайшего пути, минимальное о́стовное дерево, компоненты связности, максимальный поток, неявные графы («обход конём»), а также взаимодействие с другими графовыми библиотеками и производительность. Часть II — справочник.

Авторы подробно рассказывают о библиотеке, показывают на примерах, приближённых к реальным, как ею пользоваться: это интернет-маршрутизация, планирование телефонных сетей, задачи молекулярной биологии.

Предисловия Александра Степанова — отдельный жанр. В этом своём четырёхстраничном эссе Александр Александрович успевает снова кратко изложить идеи обобщённого программирования, упомянуть что-нибудь сложное (multi-sorted algebras — многосортные алгебры), написать код на Лиспе, похвалить C++ за выразительность и тут же поругать:

«В шаблонах отсутствует разделение между интерфейсами и реализацией. Например, недавно я пытался откомпилировать пример STL-программы из десяти строк, используя один из наиболее популярных компиляторов C++... Я был в шоке, увидев несколько страниц неразборчивых сообщений об ошибках».

За прошедшие два с лишним десятка лет в языке появились концепции, которых для ещё большей выразительности раньше не хватало. Тогда использовались собственные инструменты библиотеки Boost вместо полноценных концепций. Иначе, как показали авторы, сообщения даже из-за каких-то небольших ошибок были бы абсолютно непонятными, даже сбивающими с толку.

Содержание первой части:

  1. Введение
  2. Обобщённое программирование в C++
  3. Изучаем BGL
  4. Основные алгоритмы на графах
  5. Задачи нахождения кратчайших путей
  6. Задача минимального остовного дерева
  7. Компоненты связности
  8. Максимальный поток
  9. Неявные графы: обход конём
  10. Взаимодействие с другими графовыми библиотеками
  11. Руководство по производительности

Вторая часть (а это половина книги) — справочное руководство.

Книга не только рассказывает о графах и о том, как пользоваться библиотекой. Также есть главы, которые объясняют, почему во время проектирования создатели выбрали то или иное решение. Например, в деталях описана проблема бинарного метода.

Поизучать, как устроена библиотека BGL, стоит уже хотя бы ради того, чтобы посмотреть, как проектируют библиотеки в рамках парадигмы обобщённого программирования. Там пересекаются многие темы, причём иногда с неожиданной стороны: специализация шаблонов, поиск Кёнига, типажи (traits) и т. д.

В качестве примера строится граф на основе файла с данными об актёрах (для разбора используется библиотека Boost Tokenizer Library), нужно найти кратчайший путь от заданного актёра до Кевина Бэкона. Такую задачу решают в Университете Вирджинии.

18 июня 2023
Задача о дождевой воде. Решаем с помощью диапазонов

Дан ряд целых чисел \(a_i \geqslant 0,\) \(i=\overline{1,n}\). Числа символизируют высоту стен. Сверху идёт дождь, и вода скапливается в ячейках между стенами. В каждом столбце скапливается \(w_i\) воды. Нужно найти количество ячеек с водой: \[W=\sum_{i=1}^{n} w_i.\]

Пример: \[a=(2, 4, 1, 3, 2, 5, 2, 1, 3, 1).\]

⬛⬛⬛⬛⬛⬜⬛⬛⬛⬛
⬛⬜🟦🟦🟦⬜⬛⬛⬛⬛
⬛⬜🟦⬜🟦⬜🟦🟦⬜⬛
⬜⬜🟦⬜⬜⬜⬜🟦⬜⬛
⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜

В столбцах скопилось воды \(w=(0,0,3,1,2,0,1,2,0,0),\) в сумме \(W = 9.\)

Читать далее →
5
4 3 2 1
© MMXI—MMXXVI. RSS
 Boosty
Светлая тема / тёмная тема