Skip to content

Commit b879741

Browse files
committed
filter_view::iterator : iter_moveとiter_swapを追加 #713
1 parent 921ab26 commit b879741

File tree

4 files changed

+134
-2
lines changed

4 files changed

+134
-2
lines changed

GLOBAL_QUALIFY_LIST.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@
149149
* indirect_binary_predicate[link /reference/iterator/indirect_binary_predicate.md]
150150
* indirect_unary_predicate[link /reference/iterator/indirect_unary_predicate.md]
151151
* indirectly_comparable[link /reference/iterator/indirectly_comparable.md]
152+
* indirectly_swappable[link /reference/iterator/indirectly_swappable.md]
152153
* input_iterator[link /reference/iterator/input_iterator.md]
153154
* iterator_traits[link /reference/iterator/iterator_traits.md]
154155
* iter_difference_t[link /reference/iterator/iter_difference_t.md]
@@ -158,11 +159,14 @@
158159
* projected[link /reference/iterator/projected.md]
159160
* projected_value_t[link /reference/iterator/projected_value_t.md]
160161
* random_access_iterator[link /reference/iterator/random_access_iterator.md]
162+
* ranges::iter_move[link /reference/iterator/iter_move.md]
163+
* ranges::iter_swap[link /reference/iterator/iter_swap.md]
161164
* sentinel_for[link /reference/iterator/sentinel_for.md]
162165
* std::back_inserter[link /reference/iterator/back_inserter.md]
163166
* std::begin[link /reference/iterator/begin.md]
164167
* std::distance[link /reference/iterator/distance.md]
165168
* std::end[link /reference/iterator/end.md]
169+
* std::next[link /reference/iterator/next.md]
166170
* std::ostream_iterator[link /reference/iterator/ostream_iterator.md]
167171
* <latch>[link /reference/latch.md]
168172
* <limits>[link /reference/limits.md]

reference/ranges/filter_view/iterator.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ namespace std::ranges {
5555
5656
| 名前 | 説明 | 対応バージョン |
5757
|------------------------------------------|------------------------|----------------|
58-
| [`iter_move`](iterator/iter_move.md.nolink) | イテレータの要素の移動 | C++20 |
59-
| [`iter_swap`](iterator/iter_swap.md.nolink) | イテレータの要素の交換 | C++20 |
58+
| [`iter_move`](iterator/iter_move.md) | イテレータの要素の移動 | C++20 |
59+
| [`iter_swap`](iterator/iter_swap.md) | イテレータの要素の交換 | C++20 |
6060
6161
### 比較演算子
6262
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# iter_move
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* filter_view::iterator[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
friend constexpr range_rvalue_reference_t<V>
10+
iter_move(const iterator& i)
11+
noexcept(noexcept(ranges::iter_move(i.current_))); // (1) C++20
12+
```
13+
14+
## 概要
15+
イテレータの要素を移動する。
16+
17+
18+
## 効果
19+
以下と等価:
20+
21+
```cpp
22+
return ranges::iter_move(i.current_);
23+
```
24+
25+
26+
##
27+
```cpp example
28+
#include <iostream>
29+
#include <ranges>
30+
#include <vector>
31+
#include <string>
32+
33+
int main() {
34+
std::vector<std::string> v = {"apple", "banana", "cherry", "date"};
35+
auto is_long = [](const std::string& s) { return s.size() > 5; };
36+
37+
std::ranges::filter_view fv{v, is_long};
38+
auto it = fv.begin();
39+
40+
// iter_moveで要素をムーブ
41+
std::string s = iter_move(it);
42+
std::cout << s << std::endl; // banana
43+
44+
// ムーブ後の元要素は空になる
45+
std::cout << std::boolalpha << v[1].empty() << std::endl; // true
46+
}
47+
```
48+
* iter_move[color ff0000]
49+
50+
### 出力
51+
52+
```
53+
banana
54+
true
55+
```
56+
57+
## バージョン
58+
### 言語
59+
- C++20
60+
61+
### 処理系
62+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
63+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
64+
- [ICC](/implementation.md#icc): ?
65+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# iter_swap
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* filter_view::iterator[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
friend constexpr void
10+
iter_swap(const iterator& x, const iterator& y)
11+
noexcept(noexcept(ranges::iter_swap(x.current_, y.current_)))
12+
requires indirectly_swappable<iterator_t<V>>; // (1) C++20
13+
```
14+
15+
## 概要
16+
イテレータの要素を交換する。
17+
18+
19+
## 効果
20+
以下と等価:
21+
22+
```cpp
23+
return ranges::iter_swap(x.current_, y.current_);
24+
```
25+
26+
27+
##
28+
```cpp example
29+
#include <vector>
30+
#include <iostream>
31+
#include <ranges>
32+
33+
int main() {
34+
std::vector<int> v = {1, 2, 3, 4, 5, 6};
35+
auto is_even = [](int x) { return x % 2 == 0; };
36+
std::ranges::filter_view fv{v, is_even};
37+
38+
auto it1 = fv.begin(); // v[1] を指す
39+
auto it2 = std::next(fv.begin()); // v[3] を指す
40+
41+
std::cout << v[1] << ", " << v[3] << std::endl; // 2, 4
42+
iter_swap(it1, it2);
43+
std::cout << v[1] << ", " << v[3] << std::endl; // 4, 2
44+
}
45+
```
46+
* iter_swap[color ff0000]
47+
48+
### 出力
49+
50+
```
51+
2, 4
52+
4, 2
53+
```
54+
55+
## バージョン
56+
### 言語
57+
- C++20
58+
59+
### 処理系
60+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
61+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
62+
- [ICC](/implementation.md#icc): ?
63+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]

0 commit comments

Comments
 (0)