Namespaces
Variants

std::ranges::take_view<V>:: take_view

From cppreference.net
Ranges library
Range adaptors
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 .

#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