std::ranges::views::take, std::ranges::take_view - cppreference.com (original) (raw)

Defined in header
template< ranges::view V > class take_view : public ranges::view_interface<take_view<V>> (1) (since C++20)
namespace views { inline constexpr /* unspecified */ take = /* unspecified */; } (2) (since C++20)
Call signature
template< ranges::viewable_range R > requires /* see below */ constexpr ranges::view auto take( R&& r, ranges::range_difference_t<R> count ); (since C++20)
template< class DifferenceType > constexpr /* range adaptor closure */ take( DifferenceType&& count ); (since C++20)
  1. A range adaptor that represents view of the elements from an underlying sequence, starting at the beginning and ending at a given bound.

  2. views::take is a RangeAdaptorObject. The expression views::take(e, f) results in a view that represents the first f elements from e. The result is not necessarily a take_view.

views::take(e, f) is expression-equivalent to (where T is std::remove_cvref_t<decltype((e))> and D is ranges::range_difference_t<decltype((e))>):

otherwise, if T is a specialization of ranges::repeat_view: views::repeat(*e.value_, std::min<D>(ranges::distance(e), f)), if T models sized_range; is such case e is evaluated only once; views::repeat(*e.value_, static_cast<D>(e)) otherwise; (since C++23)

In all cases, decltype((f)) must model std::convertible_to<D>.

take_view models the concepts contiguous_range, random_access_range, bidirectional_range, forward_range, input_range, and sized_range when the underlying view V models respective concepts. It models common_range when the underlying view V models both random_access_range and sized_range.

Contents

[edit] Data members

Member Description
V base_ the underlying view(exposition-only member object*)
ranges::range_difference_t<V> count_ the number of elements to take(exposition-only member object*)

[edit] Member functions

(constructor) constructs a take_view (public member function) [edit]
base returns a copy of the underlying (adapted) view (public member function) [edit]
begin returns an iterator to the beginning (public member function) [edit]
end returns an iterator or a sentinel to the end (public member function) [edit]
size returns the number of elements, provided only if the underlying (adapted) range satisfies sized_range (public member function) [edit]
reserve_hint(C++26) returns the approximate size of the resulting approximately_sized_range (public member function) [edit]
Inherited from std::ranges::view_interface
empty returns whether the derived view is empty, provided only if it satisfies sized_range or forward_range (public member function of std::ranges::view_interface) [edit]
cbegin(C++23) returns a constant iterator to the beginning of the range (public member function of std::ranges::view_interface) [edit]
cend(C++23) returns a sentinel for the constant iterator of the range (public member function of std::ranges::view_interface) [edit]
operator bool returns whether the derived view is not empty, provided only if ranges::empty is applicable to it (public member function of std::ranges::view_interface) [edit]
data gets the address of derived view's data, provided only if its iterator type satisfies contiguous_iterator (public member function of std::ranges::view_interface) [edit]
front returns the first element in the derived view, provided if it satisfies forward_range (public member function of std::ranges::view_interface) [edit]
back returns the last element in the derived view, provided only if it satisfies bidirectional_range and common_range (public member function of std::ranges::view_interface) [edit]
operator[] returns the nth element in the derived view, provided only if it satisfies random_access_range (public member function of std::ranges::view_interface) [edit]

[edit] Deduction guides

[edit] Nested classes

| | the sentinel type(exposition-only member class template*) | | ------------------------------------------------------------- |

[edit] Helper templates

This specialization of ranges::enable_borrowed_range makes take_view satisfy borrowed_range when the underlying view satisfies it.

[edit] Example

#include #include #include   int main() { namespace views = std::views; auto print = [](char x){ std::cout << x; };   for (const char nums[]{'1', '2', '3'}; int n : views::iota(0, 5)) { std::cout << "take(" << n << "): "; // safely takes only upto min(n, nums.size()) elements: std::ranges::for_each(nums | views::take(n), print); std::cout << '\n'; } }

Output:

take(0): take(1): 1 take(2): 12 take(3): 123 take(4): 123

[edit] Defect reports

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

DR Applied to Behavior as published Correct behavior
LWG 3407 C++20 views::take sometimes failed toconstruct a sized random access range the result type is adjusted sothat construction is always valid
LWG 3494 C++20 take_view was never a borrowed_range it is a borrowed_range if its underlying view is

[edit] See also