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

来自cppreference.com
< cpp‎ | ranges‎ | take view
 
 
范围库
范围访问
范围转换器
(C++23)
范围原语



悬垂迭代器处理
范围概念
视图

范围工厂
适配器
范围生成器
范围适配器对象
范围适配器闭包对象
辅助项
 
 
take_view() requires std::default_initializable<V> = default;
(1) (C++20 起)
constexpr explicit take_view( V base, ranges::range_difference_t<V> count );
(2) (C++20 起)

构造 take_view

1) 默认构造函数。值初始化底层视图并初始化计数为 0。构造后 base() 返回 V() 的副本而 size() 返回 0
2)std::move(base) 初始化底层视图并以 count 初始化计数。构造后 base() 返回 base 的副本而 size() 返回 countranges::size(base) 的较小者。

参数

base - 底层视图
count - 要收取的元素数

示例

打印前 n 个质数,用埃拉托色尼筛法生成它们。

// https://godbolt.org/z/T76GG9dr1
#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;
    }
 
    // 仅保留奇数;0 意味着它是质数
    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 << "前 " << primes.count << " 个质数是:\n";
    for (int new_line{1}; const int prime : primes_view)
        std::cout << std::setw(3) << prime << (new_line++ % 7 ? ' ' : '\n');
}

输出:

前 42 个质数是:
  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

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3714
(P2711R1)
C++20 多参数构造函数不是显式的 改成显式的