Контейнеры
Хранят объекты и управляют памятью: vector,
array, deque, map,
unordered_map.
Раздел справочника
Стандартная библиотека C++ предоставляет контейнеры, алгоритмы, итераторы, строки, умные указатели, потоки ввода-вывода, средства работы со временем, файловой системой, многопоточностью и набор утилит для безопасного выражения владения, отсутствующих значений и вариантных типов.
Overview
Стандартная библиотека C++ закрывает большую часть повседневных задач: хранение данных, сортировку, поиск, работу со строками, временем, файлами, потоками и ресурсами. В современном C++ код обычно строится вокруг стандартных типов владения и контейнеров, а не вокруг ручного управления памятью.
std::vector
почти всегда лучше ручной пары new[] / delete[].
Хранят объекты и управляют памятью: vector,
array, deque, map,
unordered_map.
Работают поверх диапазонов и итераторов: сортировка, поиск, копирование, трансформация, подсчёт и проверка условий.
Умные указатели, lock-объекты и файловые потоки освобождают ресурсы в деструкторах.
Containers
Контейнеры стандартной библиотеки управляют хранением элементов, выделением памяти и базовыми операциями вставки, удаления и доступа. Выбор контейнера влияет на сложность операций, locality данных, стабильность ссылок и итераторов.
Динамический массив с непрерывным хранением. Хороший выбор по умолчанию.
std::arrayМассив фиксированного размера с value semantics и STL-интерфейсом.
std::dequeДвусторонняя очередь с быстрым добавлением в начало и конец.
std::listДвусвязный список. Полезен редко, когда важна стабильность узлов.
std::mapУпорядоченное ассоциативное хранилище на основе ключей.
std::unordered_mapХэш-таблица для быстрого поиска по ключу в среднем случае.
Algorithms
Заголовок <algorithm> содержит обобщённые алгоритмы,
которые работают с диапазонами через итераторы. Они позволяют отделить
логику обработки данных от конкретного контейнера.
Сортировка диапазона с произвольным доступом.
std::findЛинейный поиск значения в диапазоне.
std::count / count_ifПодсчёт элементов по значению или предикату.
std::copyКопирование элементов между диапазонами.
std::transformПреобразование элементов одного или двух диапазонов.
std::lower_boundБинарный поиск позиции в отсортированном диапазоне.
#include <algorithm>
#include <vector>
std::vector<int> values{5, 1, 9, 2, 7};
std::sort(values.begin(), values.end());
auto it = std::lower_bound(values.begin(), values.end(), 7);
bool found = it != values.end() && *it == 7;
Iterators
Итератор — объект, который указывает на элемент диапазона и позволяет переходить к другим элементам. Алгоритмы стандартной библиотеки обычно принимают пару итераторов: начало и конец диапазона.
Последовательное чтение значений. Подходит для однонаправленного прохода по данным.
Позволяет многократно проходить диапазон в прямом направлении.
Поддерживает движение вперёд и назад, например у std::list.
Поддерживает быстрый доступ по смещению, например у std::vector.
std::vector может переместить буфер
и сделать старые указатели и итераторы недействительными.
Strings
std::string хранит последовательность символов и управляет
памятью автоматически. Для передачи строки без владения часто используют
std::string_view, если вызываемый код не должен продлевать
время жизни данных.
Владеющая строка с динамическим хранением символов.
std::string_viewНевладеющее представление строки без копирования.
<charconv>Быстрое преобразование чисел в символы и обратно.
std::formatТипобезопасное форматирование строк в современном C++.
#include <string>
#include <string_view>
bool starts_with_prefix(std::string_view text, std::string_view prefix) {
return text.starts_with(prefix);
}
std::string make_message(int code) {
return "status code: " + std::to_string(code);
}
Memory
Современный C++ выражает владение ресурсами через объекты. Для динамических объектов используются умные указатели, а для массивов и буферов — контейнеры. Это уменьшает количество ручного освобождения памяти и делает API понятнее.
Единоличное владение объектом. Копирование запрещено, перемещение разрешено.
std::shared_ptrРазделяемое владение объектом через счётчик ссылок.
std::weak_ptrНевладеющая ссылка на объект, управляемый shared_ptr.
AllocatorМеханизм настройки выделения памяти для контейнеров.
std::shared_ptr по умолчанию. Если владелец
один, выбирай std::unique_ptr. Если объект хранится в
контейнере, часто достаточно самого контейнера.
Utilities
Утилитные типы помогают явно описывать состояние API: значение может отсутствовать, результат может быть одним из нескольких типов, функция может возвращать пару значений, а объект может быть перемещён.
Значение, которое может отсутствовать без использования специальных sentinel-кодов.
std::variantТипобезопасное объединение: значение одного из нескольких типов.
std::anyКонтейнер для значения произвольного копируемого типа.
std::tupleФиксированный набор значений разных типов.
std::pairПара значений, часто используется в ассоциативных контейнерах.
std::expectedРезультат операции: либо значение, либо информация об ошибке.
I/O
Библиотека ввода-вывода C++ построена вокруг потоков. Файловые потоки управляют дескрипторами через RAII: файл закрывается при уничтожении объекта потока.
Стандартный ввод, вывод и поток ошибок: cin, cout, cerr.
<fstream>Файловые потоки: ifstream, ofstream, fstream.
<sstream>Строковые потоки для форматирования и разбора строк.
std::printСовременный форматированный вывод в C++23.
#include <fstream>
#include <string>
std::string read_first_line(const char* path) {
std::ifstream file(path);
std::string line;
std::getline(file, line);
return line;
}
Time & filesystem
<chrono> предоставляет типобезопасную работу со временем,
длительностями и часами. <filesystem> позволяет
переносимо работать с путями, директориями, статусом файлов и
обходом дерева каталогов.
Длительности, time points, clocks и измерение интервалов.
<filesystem>Пути, директории, размер файлов, обход каталогов.
#include <chrono>
#include <filesystem>
namespace fs = std::filesystem;
bool is_regular_non_empty_file(const fs::path& path) {
return fs::is_regular_file(path) && fs::file_size(path) > 0;
}
auto now = std::chrono::steady_clock::now();
Concurrency
Стандартная библиотека содержит базовые средства многопоточности: потоки, mutex, lock-объекты, condition variables, futures и атомарные операции. В многопоточном коде особенно важно избегать гонок данных.
Поток исполнения, который нужно завершить через join или detach.
std::jthreadПоток с автоматическим join в деструкторе и stop_token.
std::mutexВзаимное исключение для защиты разделяемых данных.
std::atomicАтомарные операции и низкоуровневая модель памяти.
Examples
#include <string>
#include <string_view>
#include <unordered_map>
#include <vector>
std::unordered_map<std::string, int>
count_words(const std::vector<std::string>& words) {
std::unordered_map<std::string, int> result;
for (std::string_view word : words) {
++result[std::string(word)];
}
return result;
}
std::unordered_map удобен, когда нужен быстрый
поиск и обновление значения по ключу.
#include <algorithm>
#include <vector>
std::vector<int> only_positive(std::vector<int> values) {
auto new_end = std::remove_if(
values.begin(),
values.end(),
[](int x) { return x <= 0; }
);
values.erase(new_end, values.end());
return values;
}
Идиома erase-remove удаляет элементы из последовательного контейнера после перестановки неподходящих значений в конец.