std::views::take în C++

Creează o vedere cu primele n elemente ale unui range (sau toate, dacă sunt mai puține).

Sintaxă
auto v = range | std::views::take(n);

Ce face std::views::take

std::views::take(n) se oprește după n elemente. Dacă range-ul are mai puțin de n elemente, le dă pe toate, fără eroare.

Este esențial pentru range-uri infinite, precum std::views::iota(1): fără take, parcurgerea nu s-ar termina niciodată.

Parametri

Parametru Descriere
range Sursa.
n Numărul maxim de elemente.

Ce returnează

Un view cu cel mult n elemente.

Exemple

Exemplul 1: Primele 3 rezultate

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

int main() {
    std::vector<std::string> clasament{"Ana", "Ion", "Maria", "Radu", "Elena"};

    for (const auto& nume : clasament | std::views::take(3)) {
        std::println("{}", nume);
    }
    std::println("take(10) pe 5 elemente: {}", (clasament | std::views::take(10)).size());
}

Rezultat

Ana
Ion
Maria
take(10) pe 5 elemente: 5

Exemplul 2: Primele 5 pătrate perfecte impare

#include <print>
#include <ranges>

int main() {
    auto rezultat = std::views::iota(1)
                  | std::views::transform([](int x) { return x * x; })
                  | std::views::filter([](int x) { return x % 2 == 1; })
                  | std::views::take(5);
    std::println("{}", rezultat);
}

Rezultat

[1, 9, 25, 49, 81]

Greșeli frecvente

  • Pui take înaintea lui filter când voiai primele n elemente filtrate. Ordinea în conductă contează: filter | take(5) dă 5 elemente filtrate, take(5) | filter filtrează doar primele 5.

Comenzi înrudite

  • std::views::drop: Creează o vedere care sare peste primele n elemente ale unui range.
  • std::views::take_while: Creează o vedere cu elementele de la început, cât timp îndeplinesc o condiție; se oprește la primul care nu o îndeplinește.
  • std::views::iota: Generează numerele consecutive dintr-un interval (sau la infinit) fără să le stocheze.