Skip to content

Latest commit

 

History

History
99 lines (79 loc) · 2.08 KB

advance.md

File metadata and controls

99 lines (79 loc) · 2.08 KB

advance

  • ranges[meta header]
  • std::ranges[meta namespace]
  • subrange[meta class]
  • function[meta id-type]
  • cpp20[meta cpp]
constexpr subrange& advance(iter_difference_t<I> n);
  • iter_difference_t[link /reference/iterator/iter_difference_t.md]
  • subrange[link ../subrange.md]

概要

部分Rangeの先頭を前進または後退させる。引数が負の時は後退する。

効果

StoreSizeが真のとき、

auto d = n - ranges::advance(begin_, n, end_);
if (d >= 0)
  size_ -= to-unsigned-like(d);
else
  size_ += to-unsigned-like(-d);
return *this;
  • ranges::advance[link /reference/iterator/ranges_advance.md]
  • to-unsigned-like[link /reference/type_traits/make_unsigned.md]

それ以外のとき、

ranges::advance(begin_, n, end_);
return *this;
  • ranges::advance[link /reference/iterator/ranges_advance.md]

備考

  • subrangeの末端を超えて進めようとした場合、subrangeの長さは0になる。
  • subrangeの先頭を後退させたとき、元の範囲でその位置に要素があればアクセスできる。

#include <ranges>
#include <iostream>

template<std::ranges::range R>
void print(const R& r) {
  for (int x : r) {
    std::cout << x << ',';
  }
  std::cout << '\n';
}

int main()
{
  constexpr int a[] = {1, 2, 3, 4, 5};
  std::ranges::subrange sub(a + 1, a + 4);

  print(sub);

  sub.advance(1);
  print(sub);

  sub.advance(1);
  print(sub);

  sub.advance(-3);
  print(sub);

  // これ以上後退すると、先頭が配列aの範囲を超えてしまう
  // sub.advance(-1);
  // print(sub);
}

出力

2,3,4,
3,4,
4,
1,2,3,4,

バージョン

言語

  • C++20

処理系

  • Clang: 13.0.0 [mark verified]
  • GCC: 10.1.0 [mark verified]
  • ICC: ?
  • Visual C++: 2019 Update 10 [mark verified]

参照