std::ranges::take_view<V>::take_view
Depuis fr.cppreference.net
take_view() requires std::default_initializable<V> = default;
|
(1) | (depuis C++20) |
constexpr explicit take_view( V base, ranges::range_difference_t<V> count );
|
(2) | (depuis C++20) |
Construit un take_view.
1) Constructeur par défaut. Initialise par valeur la vue sous-jacente
base_ et initialise la count_ à 0. Après construction, base() renvoie une copie de V() et size() renvoie 0.2) Initialise la vue sous-jacente
base_ avec std::move(base) et la count_ avec count. Après construction, base() renvoie une copie de base et size() renvoie la plus petite valeur entre count et ranges::size(base).Paramètres
| base | - | la vue sous-jacente |
| count | - | nombre d'éléments à prendre |
Exemple
Affiche les premiers n nombres premiers générés en utilisant la méthode du Crible d'Ératosthène .
Exécuter ce code
#include <bit> #include <bitset> #include <iomanip> #include <iostream> #include <limits> #include <ranges> constexpr unsigned clog2(auto x) // ≈ ⌈ log₂(x) ⌉ { return std::numeric_limits<decltype(x)>::digits - std::countl_zero(x); } template<unsigned Count> struct FirstPrimes { static constexpr int count = Count; constexpr bool operator()(int n) // is prime? { return n < 2 ? false : n == 2 ? true : n % 2 == 0 or bits_.test(n / 2) ? false : true; } private: consteval static auto init() { std::bitset<size_ / 2 + 1> bits; for (int n{3}; n < size_; n += 2) for (int i{n}, j{3}, k{}; (k = i * j) < size_; j += 2) bits.set(k / 2); return bits; } // Keep only odd numbers; 0 means it is a prime constexpr static auto bits_ { init() }; // a(n) <= n * (log(n) + log(log(n))) static constexpr int size_ = Count * (clog2(Count) + clog2(clog2(Count))); }; int main() { constexpr FirstPrimes<42> primes; auto primes_view = std::ranges::take_view{ std::views::iota(1) | std::views::filter(primes) , primes.count }; std::cout << "First " << primes.count << " prime numbers are:\n"; for (int new_line{1}; const int prime : primes_view) std::cout << std::setw(3) << prime << (new_line++ % 7 ? ' ' : '\n'); }
Sortie :
First 42 prime numbers are: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
|
LWG 3714
( P2711R1 ) |
C++20 | le constructeur multi-paramètres n'était pas explicite | rendu explicite |