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șisize_t). Scriestd::views::iota(0uz, v.size())(C++23) saustd::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.