Namespaces
Variants

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

Depuis fr.cppreference.net
 
 
Bibliothèque de plages
Adaptateurs de plages
 
 
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 .

#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