diff --git a/reference/iterator/basic_const_iterator.md b/reference/iterator/basic_const_iterator.md index 7f5ee0d71..1a27d9853 100644 --- a/reference/iterator/basic_const_iterator.md +++ b/reference/iterator/basic_const_iterator.md @@ -27,9 +27,9 @@ namespace std { | [`operator++`](basic_const_iterator/op_increment.md) | イテレータをインクリメントする | C++23 | | [`operator--`](basic_const_iterator/op_decrement.md) | イテレータをデクリメントする | C++23 | | [`operator+=`](basic_const_iterator/op_plus_assign.md) | イテレータ自身を進める | C++23 | -| [`operator-`](basic_const_iterator/op_unary_minus.md.nolink) | イテレータを逆に進める | C++23 | | [`operator-=`](basic_const_iterator/op_minus_assign.md) | イテレータ自身を逆に進める | C++23 | -| [`operator[]`](basic_const_iterator/op_at.md.nolink) | 任意の位置にランダムアクセスする | C++23 | +| [`operator-`](basic_const_iterator/op_minus.md) | 2つの`basic_const_iterator`の差を求める | C++23 | +| [`operator[]`](basic_const_iterator/op_at.md) | 任意の位置にランダムアクセスする | C++23 | | [`operator==`](basic_const_iterator/op_equal.md.nolink) | 等値比較 | C++23 | | [`operator!=`](basic_const_iterator/op_equal.md.nolink) | 非等値比較 | C++23 | | [`operator<`](basic_const_iterator/op_less.md.nolink) | 左辺が右辺より小さいかの判定を行う | C++23 | @@ -37,8 +37,6 @@ namespace std { | [`operator>`](basic_const_iterator/op_greater.md.nolink) | 左辺が右辺より大きいかの判定を行う | C++23 | | [`operator>=`](basic_const_iterator/op_greater_equal.md.nolink) | 左辺が右辺以上かの判定を行う | C++23 | | [`operator<=>`](basic_const_iterator/op_compare_3way.md.nolink) | 三方比較を行う | C++23 | -| [`operator-`](basic_const_iterator/op_minus.md.nolink) | 2つの`basic_const_iterator`の差を求める | C++23 | -| [`operator+`](basic_const_iterator/op_plus.md.nolink) | イテレータを進める | C++23 | ## メンバ型 @@ -71,8 +69,9 @@ namespace std { | [`operator<=`](basic_const_iterator/op_less_equal.md.nolink) | 左辺が右辺以下かの判定を行う | C++23 | | [`operator>`](basic_const_iterator/op_greater.md.nolink) | 左辺が右辺より大きいかの判定を行う | C++23 | | [`operator>=`](basic_const_iterator/op_greater_equal.md.nolink) | 左辺が右辺以上かの判定を行う | C++23 | -| [`operator+`](basic_const_iterator/op_plus.md.nolink) | イテレータを進める | C++23 | -| [`operator-`](basic_const_iterator/op_minus.md.nolink) | 2つの`basic_const_iterator`の差を求める | C++23 | +| [`operator+`](basic_const_iterator/op_plus.md) | イテレータを進める | C++23 | +| [`operator-`](basic_const_iterator/op_unary_minus.md) | イテレータを逆に進める | C++23 | +| [`operator-`](basic_const_iterator/op_minus.md) | 2つの`basic_const_iterator`の差を求める | C++23 | | [`iter_move`](basic_const_iterator/iter_move.md.nolink) | イテレータの要素の移動 | C++23 | ## 非メンバ関数 diff --git a/reference/iterator/basic_const_iterator/op_at.md b/reference/iterator/basic_const_iterator/op_at.md new file mode 100644 index 000000000..00f9f55a8 --- /dev/null +++ b/reference/iterator/basic_const_iterator/op_at.md @@ -0,0 +1,64 @@ +# operator[] +* iterator[meta header] +* std[meta namespace] +* basic_const_iterator[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +constexpr reference operator[](difference_type n) const + requires random_access_iterator; +``` +* random_access_iterator[link /reference/iterator/random_access_iterator.md] + +## 概要 + +任意の位置にランダムアクセスする。 + +戻り値型`reference`は、[`iter_const_reference_t`](/reference/iterator/iter_const_reference_t.md)``のエイリアス。 + +## 効果 + +ラップしているイテレータを`current_`メンバ変数に保持するとして、以下と等価 + +```cpp +return static_cast(current_[n]); +``` + +## 例 +```cpp example +#include +#include +#include + +int main() { + std::vector vec = {1, 2, 3, 4, 5}; + + std::basic_const_iterator cit = vec.begin(); + + std::cout << cit[2] << '\n'; + std::cout << cit[4] << '\n'; + + // 要素を変更できない + // cit[0] = 0; +} +``` + +### 出力 +``` +3 +5 +``` + +## バージョン +### 言語 +- C++23 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): 13.1 +- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6 + +## 参照 + +- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html) diff --git a/reference/iterator/basic_const_iterator/op_minus.md b/reference/iterator/basic_const_iterator/op_minus.md new file mode 100644 index 000000000..76a2945f0 --- /dev/null +++ b/reference/iterator/basic_const_iterator/op_minus.md @@ -0,0 +1,93 @@ +# operator- +* iterator[meta header] +* std[meta namespace] +* basic_const_iterator[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +template S> +constexpr difference_type operator-(const S& y) const; // (1) + +template + requires sized_sentinel_for +friend constexpr difference_type operator-(const S& x, const basic_const_iterator& y); // (2) 非メンバ関数 +``` +* sized_sentinel_for[link /reference/iterator/sized_sentinel_for.md] + +## 概要 + +`basic_const_iterator`の間、もしくは`Iterator`に対応する番兵との間の距離を計算する。 + +`basic_const_iterator`のオブジェクトを`i`、`Iterator`に対応する番兵型のオブジェクトを`s`とすると + +- (1) : `i - s`のためのオーバーロード +- (2) : `s - i`のためのオーバーロード + +## テンプレートパラメータ制約 + +`not-a-const-iterator`は`I`が`basic_const_iterator`の特殊化ではない場合に`true`となる説明専用のコンセプトである。 + +## 効果 + +ラップしているイテレータを`current_`メンバ変数に保持するとして + +- (1) : 以下と等価 + ```cpp + return current_ - y; + ``` + +- (2) : 以下と等価 + ```cpp + return x - y.current_; + ``` + +## 備考 + +(2)の関数は[*Hidden friends*](/article/lib/hidden_friends.md)として定義される。 + +## 例 +```cpp example +#include +#include +#include + +int main() { + std::vector vec = {1, 2, 3, 4, 5}; + + std::basic_const_iterator cit = vec.begin(); + auto se = vec.end(); + + // 元のイテレータの番兵との間で距離計算 + std::cout << (cit - se) << '\n'; + std::cout << (se - cit) << '\n'; + + std::basic_const_iterator cse = se; + + // basic_const_iterator同士で距離計算 + // (1) -> (2)と呼ばれることで内部イテレータ同士の距離計算を行う + std::cout << (cit - cse) << '\n'; + std::cout << (cse - cit) << '\n'; +} +``` + +### 出力 +``` +-5 +5 +-5 +5 +``` + +## バージョン +### 言語 +- C++23 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): 13.1 +- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6 + +## 参照 + +- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html) diff --git a/reference/iterator/basic_const_iterator/op_plus.md b/reference/iterator/basic_const_iterator/op_plus.md new file mode 100644 index 000000000..6b8648674 --- /dev/null +++ b/reference/iterator/basic_const_iterator/op_plus.md @@ -0,0 +1,74 @@ +# operator+ (非メンバ関数) +* iterator[meta header] +* std[meta namespace] +* basic_const_iterator[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +friend constexpr basic_const_iterator operator+(const basic_const_iterator& i, difference_type n) + requires random_access_iterator; // (1) + +friend constexpr basic_const_iterator operator+(difference_type n, const basic_const_iterator& i) // (2) +``` +* random_access_iterator[link /reference/iterator/random_access_iterator.md] + +## 概要 + +イテレータを`n`回進める。 + +## 効果 + +ラップしているイテレータを`current_`メンバ変数に保持するとして、以下と等価 + +```cpp +return basic_const_iterator(i.current_ + n); +``` + +## 戻り値 + +現在位置から`n`戻したイテレータのコピーを返す。 + +## 備考 + +これらの関数は全て[*Hidden friends*](/article/lib/hidden_friends.md)として定義される。 + +## 例 +```cpp example +#include +#include +#include + +int main() { + std::vector vec = {1, 2, 3, 4, 5}; + + std::basic_const_iterator cit = vec.end(); + + auto cit2 = cit + 3; + auto cit3 = 4 + cit; + + std::cout << *cit << '\n'; + std::cout << *cit2 << '\n'; + std::cout << *cit3 << '\n'; +} +``` + +### 出力 +``` +1 +4 +5 +``` + +## バージョン +### 言語 +- C++23 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): 13.1 +- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6 + +## 参照 + +- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html) diff --git a/reference/iterator/basic_const_iterator/op_unary_minus.md b/reference/iterator/basic_const_iterator/op_unary_minus.md new file mode 100644 index 000000000..5e991296d --- /dev/null +++ b/reference/iterator/basic_const_iterator/op_unary_minus.md @@ -0,0 +1,69 @@ +# operator- (非メンバ関数) +* iterator[meta header] +* std[meta namespace] +* basic_const_iterator[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +friend constexpr basic_const_iterator operator-(const basic_const_iterator& i, difference_type n) + requires random_access_iterator; +``` +* random_access_iterator[link /reference/iterator/random_access_iterator.md] + +## 概要 + +イテレータを`n`回逆に進める。 + +## 効果 + +ラップしているイテレータを`current_`メンバ変数に保持するとして、以下と等価 + +```cpp +return basic_const_iterator(i.current_ - n); +``` + +## 戻り値 + +現在位置から`n`戻したイテレータのコピーを返す。 + +## 備考 + +この関数は[*Hidden friends*](/article/lib/hidden_friends.md)として定義される。 + +## 例 +```cpp example +#include +#include +#include + +int main() { + std::vector vec = {1, 2, 3, 4, 5}; + + std::basic_const_iterator cit = vec.end(); + + auto cit2 = cit - 3; + + std::cout << *cit << '\n'; + std::cout << *cit2 << '\n'; +} +``` + +### 出力 +``` +0 +3 +``` + +## バージョン +### 言語 +- C++23 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): 13.1 +- [Visual C++](/implementation.md#visual_cpp): 2022 Update 6 + +## 参照 + +- [P2278R4 `cbegin` should always return a constant iterator](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2278r4.html)