std::ranges::take_view<V>:: take_view
From cppreference.net
C++
Ranges library
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | |||||||||||||||||||
|
|||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
std::ranges::take_view
| Member functions | ||||
|
take_view::take_view
|
||||
|
(C++26)
|
||||
| Deduction guides | ||||
| Sentinel | ||||
| Member functions | ||||
| Non-member functions | ||||
|
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.
Value-initializes
la vue sous-jacente
base_
et initialise le
count_
à
0
. Après construction,
base()
retourne une copie de
V
(
)
et
size()
retourne
0
.
2)
Initialise la vue sous-jacente
base_
avec
std
::
move
(
base
)
et le
count_
avec
count
. Après la construction,
base()
retourne une copie de
base
et
size()
retourne le plus petit 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 |