C++
C++ с нуля для школьников и студентов: компилятор, переменные, условия, циклы, векторы, строки, функции, указатели, классы и STL на стандарте C++17.
C++ (читается «си плюс плюс») — язык программирования, который вырос из языка C. Его создал Бьёрн Страуструп: работу он начал в 1979 году, а имя C++ язык получил в 1983-м. Программа на C++ переводится компилятором (программой-переводчиком) прямо в машинный код — команды процессора, — поэтому работает очень быстро. На C++ пишут игры и игровые движки, браузеры, части операционных систем, программы для обработки видео и звука, системы торговли на биржах, прошивки для микроконтроллеров.
Для школьников и студентов у C++ есть ещё одно важное применение — олимпиады по программированию. Это самый распространённый язык на олимпиадах: он быстрый, а его стандартная библиотека (STL) даёт готовые сортировку, множества, словари и другие нужные структуры данных.
Стандарты языка
Язык развивается: с 2011 года новый стандарт выходит раз в три года — C++11, C++14, C++17, C++20, C++23. Каждый добавляет возможности, а старые программы почти всегда продолжают работать. Курс написан на C++17: его поддерживают свежие версии всех распространённых компиляторов и почти любая проверяющая система олимпиад.
Что нужно для начала
- Компьютер с Windows, Linux или macOS — подойдёт любой, даже старый.
- Компилятор — программа, которая превращает текст программы в исполняемый файл. Самые распространённые: g++ (из набора GCC, в Windows — в сборке MinGW), clang (основной в macOS) и MSVC (входит в Visual Studio). Все можно получить бесплатно, Visual Studio — в выпуске Community.
- Редактор кода или среда разработки: Visual Studio, Code::Blocks, VS Code или любой текстовый редактор.
Как всё поставить, рассказывает первый урок, а подробно про Windows — справка Как установить компилятор C++ в Windows.
Как пройти курс
Уроки идут по порядку: от первой программы до классов и стандартной библиотеки. Каждый урок опирается на предыдущие, поэтому лучше не перескакивать. Набирайте примеры сами, а не копируйте: ошибки при наборе и их исправление учат не меньше, чем сам текст. После каждого урока — несколько вопросов для проверки, в конце — итоговый тест.
В справочнике — короткие ответы на частые вопросы: что значит ошибка undefined reference, почему программа падает с segmentation fault, как вывести число с нужной точностью, как ускорить ввод и вывод.
Если язык C уже знаком, многое в первых уроках покажется знакомым; чем языки отличаются, рассказывает справка Чем C++ отличается от C. Сам язык C — в отдельной теме C.
Курс с нуля
- 1.Установка компилятора и первая программаЧто такое компилятор, как поставить g++, clang или Visual Studio, написать первую программу на C++, собрать её и запустить, и что делать с первыми ошибками.
- 2.Переменные, типы, ввод и выводКак объявить переменную в C++, какие бывают типы (int, long long, double, char, bool, string), как читать числа через cin и выводить через cout, как делятся целые числа.
- 3.Условия: if, else и switchКак программа на C++ выбирает, что делать: if и else, сравнения, логические && и ||, switch и тернарный оператор, частые ошибки вроде = вместо ==.
- 4.Циклы: for, while и do whileКак повторять действия в C++: циклы for, while и do while, break и continue, вложенные циклы, сумма чисел и цифр, чтение N чисел и частые ошибки с бесконечным циклом.
- 5.Массивы и std::vectorКак хранить много значений в C++: обычные массивы и std::vector, индексы с нуля, push_back и size, цикл по элементам, двумерные массивы и выход за границы.
- 6.Строки std::stringКак работать с текстом в C++: std::string, длина и символы, сложение и сравнение строк, substr и find, символы char и их коды, переворот строки и русские буквы в UTF-8.
- 7.Функции и ссылкиКак писать свои функции в C++: параметры и return, void, объявление до вызова, передача по значению и по ссылке, const-ссылки, перегрузка и рекурсия.
- 8.Указатели и памятьЧто такое адрес и указатель в C++, взятие адреса и разыменование, nullptr, указатели и массивы, new и delete, утечки памяти и почему vector и ссылки обычно лучше указателей.
- 9.Структуры и классыКак объединять данные в C++: struct с полями, вектор структур, методы, классы с public и private, конструкторы и const-методы — с примерами для задач и программ.
- 10.STL: sort, map и setСтандартная библиотека C++ для задач: сортировка sort со своим порядком, max_element, count, unique, множества set и словари map, pair и их скорость.
Справочник
- Segmentation fault: почему программа падаетЧто значит segmentation fault и код 0xC0000005 в C++: выход за границы массива, большой массив в стеке, бесконечная рекурсия, пустой указатель — и как быстро найти место ошибки.
- using namespace std — что этоЧто значит строка using namespace std в C++, зачем нужен std::, когда так писать можно, а когда нельзя, и откуда берётся ошибка reference to count is ambiguous.
- Быстрый ввод-выводКак ускорить cin и cout в C++: ios::sync_with_stdio(false), cin.tie(nullptr), перевод строки без endl — и почему после этого нельзя смешивать cin со scanf и как быть в интерактивных задачах.
- Ввод из файла и вывод в файлКак в C++ читать данные из файла input.txt и писать ответ в output.txt: freopen для олимпиад, ifstream и ofstream, где программа ищет файл и почему он не открывается.
- Как вывести число с нужной точностьюКак в C++ вывести дробное число с заданным количеством знаков после запятой: fixed и setprecision из iomanip, printf, почему без fixed выводится 1e+06 и как округляется.
- Как отсортировать векторСортировка в C++ одной строкой: sort по возрастанию и убыванию, обычный массив, своя функция сравнения, сортировка пар и структур, stable_sort и частые ошибки.
- Как перевести строку в число и обратноПеревод строки в число в C++: stoi, stoll, stod, число в строку — to_string, символ цифры в число, обработка ошибок invalid_argument и out_of_range.
- Как прочитать строку с пробеламиКак прочитать в C++ всю строку с пробелами через getline, почему getline после cin пропускает ввод и как это исправить через cin.ignore или ws, как читать строки до конца ввода.
- Как установить компилятор C++ в WindowsТри бесплатных способа писать на C++ в Windows: Visual Studio Community, Code::Blocks с MinGW и g++ из MSYS2 — по шагам, с проверкой и включением C++17.
- Ошибка C4996 в Visual Studio: scanf may be unsafeПочему Visual Studio не собирает программу со scanf, strcpy или freopen и пишет C4996 This function or variable may be unsafe, и как это исправить через _CRT_SECURE_NO_WARNINGS.
- Ошибка undefined referenceЧто значит ошибка undefined reference в C++ и как её исправить: нет тела функции, второй файл не собран, gcc вместо g++, нет main или WinMain, не подключена библиотека.
- Ошибка was not declared in this scopeПочему компилятор C++ пишет was not declared in this scope или undeclared identifier: забытый include, std::, опечатка, переменная вне своего блока, функция ниже места вызова.
- Переполнение int и long longПочему в C++ получается отрицательный или неверный ответ при больших числах: пределы int и long long, переполнение при умножении, 1LL, сдвиги 1LL << 40 и вывод через printf.
- Разница между ++i и i++Чем префиксный инкремент ++i отличается от постфиксного i++ в C++: какое значение получается, есть ли разница в цикле for и почему i++ + ++i писать нельзя.
- Случайные числа в C++Как получить случайное число в C++: mt19937 и uniform_int_distribution из random, дробные случайные числа, перемешивание shuffle и чем плохи rand и srand(time(0)).
- Чем C++ отличается от CЧем C++ отличается от языка C: классы, ссылки, перегрузка, шаблоны, STL, string и vector, new и delete, а также где код на C не собирается компилятором C++.
- Что такое bits/stdc++.hЧто делает строка include bits/stdc++.h в олимпиадных решениях на C++, почему она не работает в Visual Studio и на macOS и чем её заменить.
Официальная документация
- Справочник по языку и стандартной библиотеке (cppreference) — https://en.cppreference.com/w/cpp
- Standard C++ Foundation: с чего начать — https://isocpp.org/get-started
- Документация Microsoft C++ (Visual Studio) — https://learn.microsoft.com/ru-ru/cpp/