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_whilepe 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.