Skip to content

Latest commit

 

History

History
69 lines (58 loc) · 2.36 KB

contiguous_range.md

File metadata and controls

69 lines (58 loc) · 2.36 KB

contiguous_range

  • 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::dataranges::cdataで要素のポインタを取得できる。

モデル

decltype((t))T&であるような式tがあるとする。 Tcontiguous_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]

参照