std::ranges::take_view<V>::take_view
De es.cppreference.net
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 de 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 |