std::views::repeat în C++

Generează aceeași valoare repetată de n ori (sau la infinit), fără să o copieze într-un container.

Sintaxă
auto v = std::views::repeat(valoare);     // infinit
auto v = std::views::repeat(valoare, n);  // de n ori

Ce face std::views::repeat

std::views::repeat (C++23) produce o secvență în care fiecare element este aceeași valoare. Cu al doilea argument se oprește după n repetări; fără el, este infinit și se limitează cu take.

Este util combinat cu zip (o valoare comună pentru fiecare element) sau cu join (de exemplu un text repetat).

Parametri

Parametru Descriere
valoare Valoarea repetată.
n Opțional. Numărul de repetări.

Ce returnează

Un view cu valoarea repetată.

Exemple

Exemplul 1: Repetări simple

#include <print>
#include <ranges>
#include <string>

int main() {
    std::println("{}", std::views::repeat(0, 5));

    auto linie = std::views::repeat(std::string("-="), 4) | std::views::join | std::ranges::to<std::string>();
    std::println("{}", linie);
}

Rezultat

[0, 0, 0, 0, 0]
-=-=-=-=

Exemplul 2: Același oraș pentru fiecare client

#include <print>
#include <ranges>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> clienti{"Ana", "Dan", "Ioana"};

    for (auto [client, oras] : std::views::zip(clienti, std::views::repeat(std::string("Iași")))) {
        std::println("{} - {}", client, oras);
    }
}

Rezultat

Ana - Iași
Dan - Iași
Ioana - Iași

Greșeli frecvente

  • Parcurgi repeat(x) fără număr și fără take sau zip: bucla este infinită.

Comenzi înrudite

  • std::views::iota: Generează numerele consecutive dintr-un interval (sau la infinit) fără să le stocheze.
  • std::views::zip: Parcurge mai multe range-uri în paralel, oferind la fiecare pas un tuplu cu elementele de pe aceeași poziție.
  • std::views::join: Aplatizează un range de range-uri: parcurge pe rând elementele tuturor sub-range-urilor, ca o singură secvență.
  • std::fill: Atribuie aceeași valoare tuturor elementelor unui interval (fill) sau primelor n elemente (fill_n).