std::views::take_while în C++

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.

Sintaxă
auto v = range | std::views::take_while(conditie);

Ce face std::views::take_while

std::views::take_while dă elementele în ordine și se oprește definitiv la primul element pentru care condiția este falsă, chiar dacă după el urmează altele care ar îndeplini-o. Asta îl deosebește de filter.

Perechea lui este std::views::drop_while, care sare peste elementele de la început cât timp condiția este adevărată.

Parametri

Parametru Descriere
range Sursa.
conditie Funcție care returnează bool.

Ce returnează

Un view cu prefixul care îndeplinește condiția.

Exemple

Exemplul 1: take_while față de filter

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

int main() {
    std::vector<int> v{2, 4, 6, 7, 8, 10};
    auto par = [](int x) { return x % 2 == 0; };

    std::println("take_while: {}", v | std::views::take_while(par));
    std::println("filter:     {}", v | std::views::filter(par));
    std::println("drop_while: {}", v | std::views::drop_while(par));
}

Rezultat

take_while: [2, 4, 6]
filter:     [2, 4, 6, 8, 10]
drop_while: [7, 8, 10]

Exemplul 2: Puterile lui 2 sub 1000

#include <print>
#include <ranges>

int main() {
    auto puteri = std::views::iota(0)
                | std::views::transform([](int e) { return 1 << e; })
                | std::views::take_while([](int p) { return p < 1000; });
    std::println("{}", puteri);
}

Rezultat

[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

Greșeli frecvente

  • Folosești take_while pe date nesortate ca să obții „toate elementele mai mici decât x”. Se oprește la primul element prea mare.

Comenzi înrudite

  • std::views::take: Creează o vedere cu primele n elemente ale unui range (sau toate, dacă sunt mai puține).
  • std::views::filter: Creează o vedere asupra unui container care conține doar elementele ce îndeplinesc o condiție, fără copiere.
  • std::views::drop: Creează o vedere care sare peste primele n elemente ale unui range.