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) | (desde C++20) |
|
constexpr
explicit
take_view
(
V base,
ranges::
range_difference_t
<
V
>
count
)
;
|
(2) | (desde C++20) |
Construye un
take_view
.
1)
Constructor por defecto.
Inicializa por valor
la vista subyacente
base_
e inicializa el
count_
a
0
. Después de la construcción,
base()
devuelve una copia de
V
(
)
y
size()
devuelve
0
.
2)
Inicializa la vista subyacente
base_
con
std
::
move
(
base
)
y el
count_
con
count
. Después de la construcción,
base()
devuelve una copia de
base
y
size()
devuelve el menor entre
count
y
ranges::
size
(
base
)
.
Parámetros
| base | - | la vista subyacente |
| count | - | número de elementos a tomar |
Ejemplo
Imprime los primeros n números primos que se generan utilizando el método de la Criba de Eratóstenes .
Ejecutar este código
#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'); }
Salida:
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
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
|
LWG 3714
( P2711R1 ) |
C++20 | el constructor multiparámetro no era explicit | hecho explicit |