- ranges[meta header]
- concept[meta id-type]
- std::ranges[meta namespace]
- cpp20[meta cpp]
namespace std::ranges {
template<class T>
concept contiguous_range = random_access_range<T> && contiguous_iterator<iterator_t<T>> &&
requires(T& t) {
{ ranges::data(t) } -> same_as<add_pointer_t<range_reference_t<T>>>;
};
}
- random_access_range[link random_access_range.md]
- contiguous_iterator[link /reference/iterator/contiguous_iterator.md]
- iterator_t[link iterator_t.md]
- ranges::data[link data.md]
- add_pointer_t[link /reference/type_traits/add_pointer.md]
- range_reference_t[link range_reference_t.md]
contiguous_range
は、イテレータがcontiguous_iterator
であるRangeを表すコンセプトである。
contiguous_range
であるRangeは、要素がメモリ上で連続して配置されており、ranges::data
やranges::cdata
で要素のポインタを取得できる。
decltype((t))
がT&
であるような式t
があるとする。
T
がcontiguous_range
のモデルとなるのは、to_address
(
ranges::begin
(t)) ==
ranges::data
(t)
がtrue
となる場合である。
#include <ranges>
#include <vector>
int main() {
using namespace std;
// vectorはcontiguous_range
static_assert(ranges::contiguous_range<vector<int>>);
// vectorから作ったelements_viewはcontiguous_rangeではない
using view_t = ranges::elements_view<ranges::views::all_t<vector<pair<int, int>>&>, 0>;
static_assert(ranges::random_access_range<view_t>);
static_assert(!ranges::contiguous_range<view_t>);
}
- ranges::contiguous_range[color ff0000]
- ranges::elements_view[link elements_view.md]
- ranges::views::all_t[link all.md]
- ranges::random_access_range[link random_access_range.md]
- C++20
- Clang: 13.0.0 [mark verified]
- GCC: 10.1.0 [mark verified]
- ICC: ??
- Visual C++: 2019 Update 10 [mark verified]