Dyzzet|
C++
Data Science Алгоритмы Темы · Блог · YouTube
13 апреля
Хаос в выражениях с инкрементом указателя

Навеяно «мемом»

Задача: записать значение x в нулевой элемент массива p и сместить указатель на следующий элемент.

Самый очевидный и чистый вариант:

p[0] = x;
++p;

Поскольку указатель на массив, используемый без квадратных скобок, означает адрес нулевого элемента, то есть p ≡ &p[0], его разыменование даёт сам нулевой элемент. Это означает, что *p ≡ p[0].

*p = x;
++p;

Эти две операции можно объединить. Но мы должны использовать пост-инкремент (указатель инкрементируется, оператор возвращает старый указатель).

*p++ = x;

Читать далее →
17 января
Оптимизация цикла

Скажем, нам нужно сгенерировать \(n\) объектов двух типов.

def f(n):
    zeros = 0
    ones = 0
    for i in range(n):
        value = random.randint(0, 1)
        if value == 0:
            zeros += 1
        else:
            ones += 1
    return zeros, ones

При \(n = 144 \cdot 10^6\) такая программа выполняется за 2,17 с.

1. Наивная версия на C++ выполняется за 1,47 с.

size_t zeros{}, ones{};
for (size_t i{}; i < n; ++i)
{
    ++(distribution(range) % 2 == 0 ? zeros : ones);
}

Читать далее →
16 января
Обзоры книг по C++. Профессиональная литература. Часть I

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

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

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

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

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

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

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

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

Читать далее →
27 декабря 2021
Обзоры книг по C++. Структуры данных, алгоритмы, решение задач

Книги по классическим алгоритмам и структурам данных и сборники задач с решениями. Сборники задач по самому языку C++ будут в части с обзорами профессиональной литературы.

Мариус Бансила. Решение задач на современном C++

302 страницы. ДМК, 2019

Marius Bancila. The Modern C++ Challenge. Packt, 2018

Задачи и решения на C++17.

Вот темы и некоторые задачи:

  • математические задачи (код Грея, преобразование чисел в римскую запись, вычисление \(\pi\), проверка ISBN...),
  • особенности языка (перечисление адресов в IPv4, двумерный массив с базовыми операциями, функция min() с переменным числом аргументов, литералы разных температурных шкал...),
  • строки и регулярные выражения, потоки данных и файловые системы (треугольник Паскаля, удаление пустых строк из файла, удаление файлов старше заданной даты...),
  • дата и время (время выполнения программы, число дней между датами, календарь на месяц...),
  • алгоритмы и структуры данных (очередь с приоритетом, циклический буфер, двойной буфер, самый часто встречающийся элемент в диапазоне, текстовая гистограмма, фильтрация списка телефонных номеров, преобразование списка телефонных номеров, генерация всех перестановок символов в строке, средний рейтинг фильмов, алгоритм объединения в пары, алгоритм «сшивания», алгоритм выбора, алгоритм сортировки, кратчайший путь между узлами, программа Weasel, игра «Жизнь»),
  • конкурентность, шаблоны проектирования (проверка пароля, генерация паролей...),
  • сериализация данных (XML, JSON, создание PDF из коллекции изображений),
  • архивы, изображения и базы данных (поиск в ZIP-архиве, создание PNG-файла, работа с SQLite),
  • криптография (шифры, Base64, хеш-сумма файла...), сети и службы.

Читать далее →
18 декабря 2021
using namespace std

Пространства имён появились в 1993 году. Наверное, с тех пор и идут споры о директиве using namespace std и других подобных. Посмотрим, хорошо это или плохо и как пишут в разных компаниях (Google, Epic Games, Qt Company).

Что мы обычно видим.

#include <iostream>
using namespace std;
 
int main()
{
    cout << "Hello, world!" << endl;
    return 0;
}

На первый взгляд, удобно. Но в последующем возможны конфликты имён.

Читать далее →
29 ноября 2021
Обзоры книг по C++. Стандартная библиотека шаблонов

В этой части — обзоры книг о стандартной библиотеке шаблонов C++ (STL, Standard Template Library). Эта библиотека ведёт свою историю с начала 1990-х, когда её разрабатывал Александр Степанов в компании HP.

Что-то в книгах со временем устаревает, например, встречается умный указатель auto_ptr. Тем временем в последних стандартах появилось очень много нововведений: в C++11  — многопоточность, работа с точным временем, новые генераторы случайных чисел, std::array, std::forward_list, std::unordered_map и пр., в C++17 — std::string_view, математические функции, работа с файловой системой, вариативный тип std::any, параллельные версии для алгоритмов и множество мелких улучшений, в C++20 — невладеющие указатели на массив std::span, библиотека для работы с битами, ranges, chrono, расширенная библиотека потоков и пр.

Леен Аммерааль. STL для программистов на C++

240 страниц. ДМК, 1999

Leen Ammeraal. STL for C++ Programmers. John Wiley, 1997

Книга начинается с короткого введения в шаблоны, экскурса в историю (как разработка HP вошла в стандарт).

Читать далее →
5 ноября 2021
Обзоры книг по C++. Русскоязычная литература. Часть IV

Татьяна Александровна Павловская. C/C++. Программирование на языке высокого уровня

464 страницы. Питер, 2021

В соавторстве с Юрием Абрамовичем Щупаком Татьяна Александровна выпустила практикумы по структурному (239 с.) и объектно-ориентированному программированию (265 с.). Разделы озаглавлены как «семинары», то есть это методическая поддержка для преподавателя, а не что-то полезное для студента.

Книга по несуществующему языку C/C++. Структурное программирование, ООП и библиотека.

В начале: алфавит, лексема... ну сколько можно. Форматирование, конечно, будет плохим, порой — «стеночкой». С транслитом (sort_vybor).

Терминология местами вольная: то «помеченный оператор» (совсем не оператор), то «метка».

Читать далее →
4 ноября 2021
Обзоры книг по C++. Русскоязычная литература. Часть III

Максим Валерьевич Кузнецов, Игорь Вячеславович Симдянов. C++. Мастер-класс в задачах и примерах

480 страниц. БХВ-Петербург, 2007

Сборник плохо отформатированных ошибок.

int i = 10;
 
if(++i == i++) cout << "числа равны\n";
else cout << "числа не равны\n";
 
if(i++ == ++i) cout << "числа равны\n";
else cout << "числа не равны\n";
 
if(++i == ++i) cout << "числа равны\n";
else cout << "числа не равны\n";
 
if(i++ == i++) cout << "числа равны\n";
else cout << "числа не равны\n";
 
if(i++ == -- i) cout << "числа равны\n";
else cout << "числа не равны\n";
 
if(i++ == i--) cout << "числа равны\n";
else cout << "числа не равны\n";
 
if(i-- == ++i) cout << "числа равны\n";
else cout << "числа не равны\n";
 
if(i-- == i++) cout << "числа равны\n";
else cout << "числа не равны\n";

Читать далее →
3 ноября 2021
Обзоры книг по C++. Русскоязычная литература. Часть II

Владимир Григорьевич Давыдов. Программирование и основы алгоритмизации

447 страниц. Высшая школа, 2003

Эта книга не обещает научить языку C++, к тому же автор упорно пишет Си/C++. В основном будет часть, совместимая с C (в том числе константы не const, а #define). Форматирование будет не идеальное, где-то — транслит (kaf_name — «название кафедры»).

Сперва идут системы счисления, история языков программирования, блок-схемы. Автор немного знакомит с грамматиками и тем, как их представляют.

Читать далее →
3 мая 2021
Обзоры книг по C++. Русскоязычная литература. Часть I

Здесь перечислена базовая литература по языку C++ русскоязычных авторов, кроме книг, опубликованных издательствами университетов, и книг по конкретным технологиям (C++ Builder, Visual C++, Qt). Русскоязычная литература для профессионалов, специальная литература и книги по STL — всё это будет в соответствующих разделах.

Аверкин В. П., Бобровский А. И., Веснич В. В., Радушинский В. Ф., Хомоненко Анатолий Дмитриевич. Программирование на C++

256 страниц. Корона-Принт, 1999

Книгу сопровождает комментарий «Под редакцией профессора А. Д. Хомоненко», ему же принадлежит и предисловие. Этот автор написал и другие книги — по языку Delphi и базам данных.

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

#include “f:\POS_C\PRIMER\point.cpp“

А некоторые — просто ошибочны. Здесь вместо delete[] авторы написали delete (к тому же используется транслит и неоправданное сокращение).

int *mas=new int[n];
 . . .
delete mas;

Хотя в этой части нет книг, полностью посвящённых конкретным технологиям, последняя глава этой книги с кучей скриншотов показывает работу с Borland C++ Builder.

Читать далее →
3
2 1
© MMXI—MMXXII. RSS. Поддержать сайт
Светлая тема / тёмная тема