Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
basic_const_iterator : [] - + 追加 #1084
- Loading branch information
Showing
5 changed files
with
305 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<Iterator>; | ||
``` | ||
* random_access_iterator[link /reference/iterator/random_access_iterator.md] | ||
|
||
## 概要 | ||
|
||
任意の位置にランダムアクセスする。 | ||
|
||
戻り値型`reference`は、[`iter_const_reference_t`](/reference/iterator/iter_const_reference_t.md)`<Iterator>`のエイリアス。 | ||
|
||
## 効果 | ||
|
||
ラップしているイテレータを`current_`メンバ変数に保持するとして、以下と等価 | ||
|
||
```cpp | ||
return static_cast<reference>(current_[n]); | ||
``` | ||
|
||
## 例 | ||
```cpp example | ||
#include <iostream> | ||
#include <iterator> | ||
#include <vector> | ||
|
||
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<sized_sentinel_for<Iterator> S> | ||
constexpr difference_type operator-(const S& y) const; // (1) | ||
|
||
template<not-a-const-iterator S> | ||
requires sized_sentinel_for<S, Iterator> | ||
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<Iterator>`のオブジェクトを`i`、`Iterator`に対応する番兵型のオブジェクトを`s`とすると | ||
|
||
- (1) : `i - s`のためのオーバーロード | ||
- (2) : `s - i`のためのオーバーロード | ||
|
||
## テンプレートパラメータ制約 | ||
|
||
`not-a-const-iterator<I>`は`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 <iostream> | ||
#include <iterator> | ||
#include <vector> | ||
|
||
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<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 <iostream> | ||
#include <iterator> | ||
#include <vector> | ||
|
||
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<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 <iostream> | ||
#include <iterator> | ||
#include <vector> | ||
|
||
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) |