From 09c1ad78bd5be675d94afdc1e49adcaa6ff7ca4d Mon Sep 17 00:00:00 2001 From: onihusube <44743040+onihusube@users.noreply.github.com> Date: Fri, 4 Aug 2023 15:07:04 +0900 Subject: [PATCH] =?UTF-8?q?basic=5Fconst=5Fiterator=20:=20=3D=3D=20<=3D>?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=20#1084?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/iterator/basic_const_iterator.md | 6 +- .../basic_const_iterator/op_compare_3way.md | 103 +++++++++++++++++ .../iterator/basic_const_iterator/op_equal.md | 104 ++++++++++++++++++ 3 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 reference/iterator/basic_const_iterator/op_compare_3way.md create mode 100644 reference/iterator/basic_const_iterator/op_equal.md diff --git a/reference/iterator/basic_const_iterator.md b/reference/iterator/basic_const_iterator.md index 1a27d9853..a6d62a285 100644 --- a/reference/iterator/basic_const_iterator.md +++ b/reference/iterator/basic_const_iterator.md @@ -30,13 +30,13 @@ namespace std { | [`operator-=`](basic_const_iterator/op_minus_assign.md) | イテレータ自身を逆に進める | 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_equal.md) | 等値比較 | C++23 | +| `operator!=` | 非等値比較 ([`==`](basic_const_iterator/op_equal.md)により使用可能) | C++23 | | [`operator<`](basic_const_iterator/op_less.md.nolink) | 左辺が右辺より小さいかの判定を行う | C++23 | | [`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_compare_3way.md.nolink) | 三方比較を行う | C++23 | +| [`operator<=>`](basic_const_iterator/op_compare_3way.md) | 三方比較を行う | C++23 | ## メンバ型 diff --git a/reference/iterator/basic_const_iterator/op_compare_3way.md b/reference/iterator/basic_const_iterator/op_compare_3way.md new file mode 100644 index 000000000..7ab85c95e --- /dev/null +++ b/reference/iterator/basic_const_iterator/op_compare_3way.md @@ -0,0 +1,103 @@ +# operator<=> +* iterator[meta header] +* std[meta namespace] +* basic_const_iterator[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +constexpr auto operator<=>(const basic_const_iterator& y) const + requires random_access_iterator && three_way_comparable; // (1) + +template I> +constexpr auto operator<=>(const I& y) const + requires random_access_iterator && totally_ordered_with && + three_way_comparable_with; // (2) +``` +* different-from[link /reference/ranges/different-from.md] +* random_access_iterator[link /reference/iterator/random_access_iterator.md] +* three_way_comparable[link /reference/compare/three_way_comparable.md] +* totally_ordered_with[link /reference/concepts/totally_ordered_with.md] + +## 概要 + + +`basic_const_iterator`オブジェクトと別のイテレータ(`basic_const_iterator`か`Iterator`、`Iterator`と比較可能なオブジェクト)の三方比較を行う。 + +- (1) : `basic_const_iterator`同士の比較を行う +- (2) : ラップしているイテレータ(`Iterator`)と直接比較可能な型との間で比較を行う + +## 効果 + +ラップするイテレータを`current_`というメンバに保持するとして + +- (1) : 以下と等価 + ```cpp + return current_ <=> y.current_; + ``` + +- (2) : 以下と等価 + ```cpp + return current_ <=> y; + ``` + +## 備考 + +(2)の演算子により以下の演算子が使用可能になる(制約は同じものが適用される)。 + +```cpp +// 逆順 +template I> +friend constexpr auto operator<=>(const I&, const basic_const_iterator&); +``` + +## 例 +```cpp example +#include +#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::basic_const_iterator cse = se; + + + std::cout << std::boolalpha; + + // (1) basic_const_iterator同士の比較 + std::cout << std::is_lt(cit <=> cse) << '\n'; + std::cout << std::is_lt(cse <=> cit) << '\n'; + + // (2) 元のイテレータとの比較 + std::cout << std::is_lt(cit <=> se) << '\n'; + std::cout << std::is_lt(se <=> cit) << '\n'; +} +``` +* <=>[color ff0000] +* is_lt[link /reference/compare/named_comparison_functions.md] + +### 出力 + +``` +true +false +true +false +``` + +## バージョン +### 言語 +- 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_equal.md b/reference/iterator/basic_const_iterator/op_equal.md new file mode 100644 index 000000000..d9bfd98ec --- /dev/null +++ b/reference/iterator/basic_const_iterator/op_equal.md @@ -0,0 +1,104 @@ +# operator== +* iterator[meta header] +* std[meta namespace] +* basic_const_iterator[meta class] +* function[meta id-type] +* cpp23[meta cpp] + +```cpp +template S> +constexpr bool operator==(const S& s) const; +``` +* sentinel_for[link /reference/iterator/sentinel_for.md] + +## 概要 + +`basic_const_iterator`オブジェクトと別のイテレータ(`basic_const_iterator`か`Iterator`のオブジェクト)が同じ要素を指しているかを判定する。 + +## 効果 + +ラップしているイテレータを`current_`メンバ変数に保持するとして、以下と等価 + +```cpp +return current_ == s; +``` + +## 戻り値 + +2つのイテレータが同じ要素を指している場合に`true`を返す。 + + +## 備考 + +この演算子により以下の演算子が使用可能になる。 + +```cpp +// != +template S> +constexpr bool operator!=(const S&) const; + +// 逆順 +template S> +friend constexpr bool operator==(const S&, const basic_const_iterator&); + +template S> +friend constexpr bool operator!=(const S&, const basic_const_iterator&); +``` + +## 例 +```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 << std::boolalpha; + + // 元のイテレータとの比較 + std::cout << (cit == se) << '\n'; + std::cout << (se == cit) << '\n'; + + std::basic_const_iterator cse = se; + + // basic_const_iterator同士の比較 + std::cout << (cit == cse) << '\n'; + std::cout << (cse == cit) << '\n'; + + // !=の導出 + std::cout << (cit != se) << '\n'; + std::cout << (se != cit) << '\n'; + std::cout << (cit != cse) << '\n'; + std::cout << (cse != cit) << '\n'; +} +``` +* ==[color ff0000] + +### 出力 +``` +false +false +false +false +true +true +true +true +``` + +## バージョン +### 言語 +- 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)