5.5 KiB
[range.zip.view]
25 Ranges library [ranges]
25.7 Range adaptors [range.adaptors]
25.7.25 Zip view [range.zip]
25.7.25.2 Class template zip_view [range.zip.view]
namespace std::ranges {template<class... Rs>concept zip-is-common = // exposition only(sizeof...(Rs) == 1 && (common_range && ...)) ||(!(bidirectional_range && ...) && (common_range && ...)) ||((random_access_range && ...) && (sized_range && ...)); template<input_range... Views>requires (view && ...) && (sizeof...(Views) > 0)class zip_view : public view_interface<zip_view<Views...>> { tuple<Views...> views_; // exposition only// [range.zip.iterator], class template zip_view::iteratortemplate class iterator; // exposition only// [range.zip.sentinel], class template zip_view::sentineltemplate class sentinel; // exposition onlypublic: zip_view() = default; constexpr explicit zip_view(Views... views); constexpr auto begin() requires (!(simple-view && ...)) {return iterator(tuple-transform(ranges::begin, views_)); }constexpr auto begin() const requires (range && ...) {return iterator(tuple-transform(ranges::begin, views_)); }constexpr auto end() requires (!(simple-view && ...)) {if constexpr (<Views...>) {return sentinel(tuple-transform(ranges::end, views_)); } else if constexpr ((random_access_range && ...)) {return begin() + iter_difference_t<iterator>(size()); } else {return iterator(tuple-transform(ranges::end, views_)); }}constexpr auto end() const requires (range && ...) {if constexpr (
) {return sentinel(tuple-transform(ranges::end, views_)); } else if constexpr ((random_access_range && ...)) {return begin() + iter_difference_t<iterator>(size()); } else {return iterator(tuple-transform(ranges::end, views_)); }}constexpr auto size() requires (sized_range && ...); constexpr auto size() const requires (sized_range && ...); }; template<class... Rs> zip_view(Rs&&...) -> zip_view<views::all_t...>;}
Two zip_view objects have the same underlying sequence if and only if the corresponding elements of views_ are equal ([concepts.equality]) and have the same underlying sequence.
[Note 1:
In particular, comparison of iterators obtained from zip_view objects that do not have the same underlying sequence is not required to produce meaningful results ([iterator.concept.forward]).
â end note]
constexpr explicit zip_view(Views... views);
Effects: Initializes views_ with std::move(views)....
constexpr auto size() requires ([sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]")<Views> && ...); constexpr auto size() const requires ([sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]")<const Views> && ...);
Effects: Equivalent to:return apply([](auto... sizes) {using CT = make-unsigned-like-t<common_type_t<decltype(sizes)...>>; return ranges::min({CT(sizes)...});}, tuple-transform(ranges::size, views_));