TGViewer
Библиотека C/C++ разработчика | cpp, boost, qt Библиотека C/C++ разработчика | cpp, boost, qt @cppproglib · 16.9K subscribers
Post #6566 2.64K
🥳 C++ Ranges. Часть 1: Основы

«Если ты думаешь, что циклы — это нормально, ты просто ещё не видел Ranges»
— Каждый разработчик C++20, примерно через неделю после знакомства с библиотекой


🌸 Введение

Добро пожаловать в мир C++ Ranges — одного из самых мощных нововведений стандарта C++20.

Если ты когда-нибудь писал вот такой код:

std::vector<int> result;
for (const auto& x : data) {
if (x % 2 == 0) {
result.push_back(x * x);
}
}


..то ты знаешь, как это может быть многословно. Ranges позволяют написать то же самое так:

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


Красиво? Ещё и эффективнее! Давай разберёмся, как это работает.


🍴 Что нам понадобится

Для работы со всеми примерами нужен компилятор с поддержкой C++20 (и лучше C++23):

#include <ranges> // std::views, std::ranges::*
#include <algorithm> // std::ranges::sort и другие


1️⃣ Что такое Range?

Range (диапазон) — это любой тип, у которого есть начало ( begin ) и конец ( end ). Всё, что ты
привык итерировать в цикле for , уже является диапазоном.

std::vector<int> v = {1, 2, 3, 4, 5}; // ✓ Range
std::string s = "hello"; // ✓ Range
int arr[] = {1, 2, 3}; // ✓ Range
std::list<double> l = {1.1, 2.2}; // ✓ Range


С технической точки зрения, тип R является диапазоном, если для него определены
std::ranges::begin(r) и std::ranges::end(r) . В C++ это выражается через концепт:

template<typename R>
concept range = requires(R& r) {
std::ranges::begin(r); // требуем наличие begin
std::ranges::end(r); // требуем наличие end
};



🍪 Категории диапазонов

input_range — однопроходный обход (Пример: поток ввода)
forward_range — многопроходный обход (Пример: std::forward_list)
bidirectional_range — обход в обе стороны (Пример: std::list)
random_access_range — доступ за O(1) по индексу (Пример: std::deque)
contiguous_range — данные в непрерывной памяти (Пример: std::vector , массив)


🐸 Продолжение следует... Дальше разберём, какие алгоритмы можно использовать с Ranges.

📍Навигация: ВакансииЗадачиСобесы

Библиотека C/C++ разработчика

#константная_правильность
  • ❤ 12
  • 👍 9
  • 🙏 2
More from @cppproglib
  1. Sep 19, 2026А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tp…
  2. Sep 18, 2026От исходного кода до процессора: разберись, как работает программа 💻 Стартует практически…
  3. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  4. Sep 13, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  5. Sep 13, 2026🤩 Inline static в классах — забудь про .cpp Сколько раз ты забывал добавить определение s…
  6. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →