Если вы предпочитаете первоисточник, то вам подойдёт книга Бьерна Страуструпа «Язык программирования C++. Краткий курс» (2019), самая человечная из его книг. Если вы уже хорошо изучили язык, вам может понравиться книга «Дизайн и эволюция C++» (оригинал 1994 года), хотя она и не несёт практической пользы.
Авторы Стенли Б. Липпман, Жози Лажойе, Барбара Э. Му написали хорошую книгу «Язык программирования C++. Базовый курс» (2014), которая не только переиздаётся, но и обновляется. С. Липпман и Б. Му принимали участие в стандартизации языка.
На удивление хорошей оказалась книга Сиддхартхи Рао «Освой самостоятельно C++ по одному часу в день» (2017).
Книга Майкла Доусона «Изучаем C++ через программирование игр» (2016) может послужить стимулом для начинающих разработчиков.
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\).
Глава «Оптимизация, влияющая на поведение компьютера» — очерк того, с какими абстракциями аппаратного и программного обеспечения приходится иметь дело. Большая часть тем — это последовательное улучшение некоторого базового примера.
Boost — огромный набор библиотек.
346 страниц. ДМК Пресс, 2020
Antony Polukhin. Boost C++ Application Development Cookbook. Packt, 2013
Антон Полухин — автор нескольких библиотек Boost, поддерживает ряд старых библиотек и сейчас представляет Россию в международном комитете по стандартизации C++.
Оглавление:
Последняя глава посвящена графам, генератору истинно случайных чисел, переносимым математическим функциям, объединению нескольких тестовых случаев в одном тестовом модуле и манипулированию изображениями.
$ ./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]
);
Книга рассказывает о многих вещах, но довольно поверхностно. Но как ознакомительный обзор вполне годится.
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 вместо полноценных концепций. Иначе, как показали авторы, сообщения даже из-за каких-то небольших ошибок были бы абсолютно непонятными, даже сбивающими с толку.
Содержание первой части:
Вторая часть (а это половина книги) — справочное руководство.
Книга не только рассказывает о графах и о том, как пользоваться библиотекой. Также есть главы, которые объясняют, почему во время проектирования создатели выбрали то или иное решение. Например, в деталях описана проблема бинарного метода.
Поизучать, как устроена библиотека BGL, стоит уже хотя бы ради того, чтобы посмотреть, как проектируют библиотеки в рамках парадигмы обобщённого программирования. Там пересекаются многие темы, причём иногда с неожиданной стороны: специализация шаблонов, поиск Кёнига, типажи (traits) и т. д.
В качестве примера строится граф на основе файла с данными об актёрах (для разбора используется библиотека Boost Tokenizer Library), нужно найти кратчайший путь от заданного актёра до Кевина Бэкона. Такую задачу решают в Университете Вирджинии.
242 страницы. Альпина нон-фикшн, 2021
Небольшая интересная книга с необычной обложкой.
Содержание:
Возможно, самая большая проблема книги — то, что название не совпадает с содержанием. Вернее было бы сказать «Объясняя новости науки». Нас трижды предупреждали ещё в аннотации, но мы не слушали.
Дан ряд целых чисел \(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.\)
В C++11 появились три вида умных (интеллектуальных) указателей: std::unique_ptr, std::shared_ptr и std::weak_ptr. Они избавляют от заботы освобождать память и другие ресурсы (если с ними правильно обращаться).
struct Base
{
virtual void print() const noexcept
{
std::cout << "Base (const)" << std::endl;
}
virtual void print() noexcept
{
std::cout << "Base" << std::endl;
}
virtual ~Base() = default;
};
Уникальный в каком-то смысле труд. Шесть книг по программированию. Четыре из них — по языкам Pascal и Delphi, а две другие — по языку Python. И хотя тема не C++, мимо названия «Полезное программирование» было трудно пройти, да и сам автор время от времени высказывается о C++.
256 страниц. СОЛОН-пресс, 2016
Аннотация обещает сделать из читателя большого профессионала.
«Книга для тех, кто умеет программировать и уже готов этим зарабатывать.
Курс молодого, но профессионального программиста. Практические советы.
Что пригодится вам из пройденного и сданного. Что вы будете программировать сначала, а что позже, когда наберётесь опыта. К чему ещё можно применить ваш программистский талант, чтобы руководство одобрило и поощрило. Кратко, доступно, убедительно».
В Рунете полно сайтов о программировании, в основном там много статей для новичков. Такие сайты могут выглядеть модно, но работа авторов и редакторов (если они вообще есть) часто недотягивает до приличного уровня.
Небольшой, но показательный пример. Автор заявляет, что «this является const указателем».
class Foo {
private:
int x;
public:
Foo(int x = 0) { this->x = x; }
void change(Foo *foo) { this = foo; }
void print() { cout << x << endl; }
};
И никого не смутило, что компилятор прямо говорит о причине:
Тип указателя this — либо Foo*, либо const Foo*. Он не может быть Foo* const или const Foo* const. А присвоить ему ничего нельзя потому, что он не является левосторонним значением (lvalue); по-простому — не может стоять слева от знака присваивания.
Читайте хорошие книги и сайты.