🧰 STL: скрытые фишки стандартной библиотеки C++

STL — это не только vector и map. Разбираем полезные, но редко используемые инструменты вроде transform, accumulate, variant, ranges.

Разработка

6 мин

Стандартная библиотека C++ — это мощнейший инструмент, который часто недооценивают. Все знают про vector, map и string, но STL (Standard Template Library) — это не только про базовые контейнеры.

Сегодня Кодик покажет малоизвестные, но чертовски полезные фишки STL, которые прокачают твой код, сделают его чище и короче 💪

🔍 1. std::accumulate — компактная агрегация

Вместо ручного цикла для подсчёта суммы чисел:

int sum = 0;
for (int x : v) sum += x;

Можно просто:

#include <numeric>
int sum = std::accumulate(v.begin(), v.end(), 0);

🌀 2. std::transform — функциональный подход

Нужно применить операцию к каждому элементу? Не пиши цикл — используй transform:

std::vector<int> result;
std::transform(v.begin(), v.end(), std::back_inserter(result), [](int x) {
    return x * 2;
});

🧩 3. std::any и std::variant — хранение любых типов

std::variant<int, std::string> val = "Привет";
if (std::holds_alternative<std::string>(val)) {
    std::cout << std::get<std::string>(val);
}

🧱 4. std::unordered_map и std::unordered_set — мощь хэш-таблиц

Когда ты используешь обычные std::map и std::set, под капотом работает сбалансированное бинарное дерево (обычно красно-черное дерево). Это означает, что операции вставки, поиска и удаления занимают O(log n) времени.

А вот std::unordered_map и std::unordered_set устроены по-другому: они используют хэш-таблицы. За счёт этого они обеспечивают среднюю сложность операций — O(1). Это делает их намного быстрее в большинстве прикладных задач, особенно при большом объёме данных.

🔥 Пример:

#include <unordered_map>
#include <string>
#include <iostream>

int main() {
    std::unordered_map<std::string, int> scores;
    scores["Alice"] = 90;
    scores["Bob"] = 75;

    std::cout << scores["Alice"]; // 90
}

В отличие от std::map, unordered_map не гарантирует порядок элементов. Если тебе не важно, в каком порядке хранятся данные, — используй unordered_-версии для максимальной производительности.

🧠 Когда использовать?

Нужно сохранить порядок?

Используй

Да

std::map, std::set

Нет

std::unordered_map, std::unordered_set

🧵 5. std::ranges (начиная с C++20)

#include <ranges>

auto result = v 
    | std::views::filter([](int x) { return x % 2 == 0; })
    | std::views::transform([](int x) { return x * x; });

Позволяет писать цепочки операций — красиво и компактно.

🤯 Бонус: что ещё есть в STL

  • std::optional — безопасная альтернатива "магическим значениям"

  • std::span — удобная передача диапазонов

  • std::bitset — компактная работа с флагами

  • std::invoke — вызов любых функций, включая member-функции

Если хочешь научиться использовать STL в реальных задачах — скачай приложение Кодик. Там тебя ждут:

  • 🧠 Интерактивные уроки по C++

  • ✅ Упражнения с проверкой решений

  • 💬 Сообщество разработчиков

Учись программировать не один — а с поддержкой и нашим Telegram-каналом 💙

Комментарии