std::views::iota în C++

Generează numerele consecutive dintr-un interval (sau la infinit) fără să le stocheze.

Sintaxă
auto v = std::views::iota(inceput);         // infinit
auto v = std::views::iota(inceput, sfarsit); // [inceput, sfarsit)

Ce face std::views::iota

std::views::iota(a, b) produce a, a+1, ..., b-1; capătul b nu este inclus. Cu un singur argument, șirul este infinit și trebuie limitat cu take sau take_while.

Valorile nu sunt stocate nicăieri: fiecare se calculează când este cerută. Este înlocuitorul modern pentru for (int i = a; i < b; ++i) în conducte de view-uri. Ambele capete trebuie să aibă tipuri compatibile.

Parametri

Parametru Descriere
inceput Prima valoare.
sfarsit Opțional. Valoarea la care se oprește (exclusă).

Ce returnează

Un view de valori consecutive.

Exemple

Exemplul 1: Interval simplu și tabla înmulțirii

#include <print>
#include <ranges>

int main() {
    std::println("{}", std::views::iota(1, 6));

    for (int i : std::views::iota(1, 4)) {
        for (int j : std::views::iota(1, 4)) {
            std::print("{:3}", i * j);
        }
        std::println("");
    }
}

Rezultat

[1, 2, 3, 4, 5]
  1  2  3
  2  4  6
  3  6  9

Exemplul 2: Primele 5 numere prime

#include <algorithm>
#include <print>
#include <ranges>

int main() {
    auto e_prim = [](int n) {
        if (n < 2) {
            return false;
        }
        return std::ranges::none_of(std::views::iota(2, n), [n](int d) { return d * d <= n && n % d == 0; });
    };

    std::println("{}", std::views::iota(1) | std::views::filter(e_prim) | std::views::take(5));
}

Rezultat

[2, 3, 5, 7, 11]

Greșeli frecvente

  • Amesteci tipuri: std::views::iota(0, v.size()) nu compilează (int și size_t). Scrie std::views::iota(0uz, v.size()) (C++23) sau std::size_t{0}.
  • Parcurgi std::views::iota(1) fără limită: bucla nu se termină niciodată.

Comenzi înrudite

  • std::iota: Completează un interval cu valori consecutive: valoare, valoare + 1, valoare + 2…
  • std::views::take: Creează o vedere cu primele n elemente ale unui range (sau toate, dacă sunt mai puține).
  • std::views::reverse: Creează o vedere care parcurge un range de la ultimul element la primul, fără să-l modifice.
  • std::views::repeat: Generează aceeași valoare repetată de n ori (sau la infinit), fără să o copieze într-un container.