Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::ranges...w::take_view(3) C++ Standard Libarystd::ranges...w::take_view(3)

NAME
       std::ranges::take_view::take_view - std::ranges::take_view::take_view

Synopsis
	  take_view()	requires   std::default_initializable<V>   =  default;
       (1) (since C++20)
	  constexpr	   explicit	    take_view(	       V	 base,
       (2) (since C++20)
	  ranges::range_difference_t<V>	count );

	  Constructs a take_view.

	  1)  Default  constructor.  Value-initializes the underlying view and
       initializes the
	  count	to 0. After construction, base() returns a  copy  of  V()  and
       size() returns 0.
	  2)  Initializes  the	underlying  view  with std::move(base) and the
       count with count.
	  After	construction, base() returns a copy of base and	size() returns
       the smaller of
	  count	and ranges::size(base).

Parameters
	  base	- the underlying view
	  count	- number of elements to	take

Example
	  Prints first n prime numbers that are	generated using	Sieve  of  Er-
       atosthenes method.

       // Run this code

	#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::fil-
       ter(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');
	}

Output:
	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

	  Defect reports

	  The following	behavior-changing defect reports were applied retroac-
       tively to
	  previously published C++ standards.

	     DR	       Applied	  to		    Behavior	as   published
       Correct behavior
	  LWG  3714   C++20	  the  multi-parameter	constructor  was   not
       made explicit
	  (P2711R1)	       explicit

http://cppreference.com		  2024.06.10	 std::ranges...w::take_view(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::ranges::take_view::take_view&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help