Skip to content

Commit 8583508

Browse files
committed
add pages ranges_find_last(s) to algorithm
1 parent d9fb8cf commit 8583508

File tree

5 files changed

+273
-3
lines changed

5 files changed

+273
-3
lines changed

lang/cpp23.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,9 @@ C++23とは、2023年中に改訂される予定の、C++バージョンの通
156156
- [`<algorithm>`](/reference/algorithm.md)に、範囲の先頭が指定した範囲と合致するかを判定する[`std::starts_with()`](/reference/algorithm/ranges_starts_with.md)、範囲の末尾が指定した範囲と合致するかを判定する[`std::ends_with()`](/reference/algorithm/ranges_ends_with.md)を追加
157157
- [`<algorithm>`](/reference/algorithm.md)に、要素を左シフトさせるRangeアルゴリズム[`std::ranges::shift_left()`](/reference/algorithm/ranges_shift_left.md)、要素を右シフトさせるRangeアルゴリズム[`std::ranges::shift_right()`](/reference/algorithm/ranges_shift_right.md)を追加
158158
- [`<algorithm>`](/reference/algorithm.md)に、範囲の末尾から要素を検索する以下のアルゴリズムを追加:
159-
- [`std::ranges::find_last()`](/reference/algorithm/ranges_find_last.md.nolink)
160-
- [`std::ranges::find_last_if()`](/reference/algorithm/find_last_if.md.nolink)
161-
- [`std::ranges::find_last_if_not()`](/reference/algorithm/find_last_if_not.md.nolink)
159+
- [`std::ranges::find_last()`](/reference/algorithm/ranges_find_last.md)
160+
- [`std::ranges::find_last_if()`](/reference/algorithm/find_last_if.md)
161+
- [`std::ranges::find_last_if_not()`](/reference/algorithm/find_last_if_not.md)
162162
- [`<algorithm>`](/reference/algorithm.md)に、範囲に特定の値が含まれているかを判定する[`std::ranges::contains()`](/reference/algorithm/ranges_contains.md)[`std::ranges::contains_subrange`](/reference/algorithm/ranges_contains_subrange.md)を追加
163163
- [`<algorithm>`](/reference/algorithm.md)に、数値に限定しない汎用的な畳み込みアルゴリズムとして、以下を追加:
164164
- [`std::ranges::fold_left()`](/reference/algorithm/ranges_fold_left.md)

reference/algorithm.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ ranges::sort(pv, {}, &Person::name);
149149
| [`ranges::find`](algorithm/ranges_find.md) | 指定された値を検索する | C++20 |
150150
| [`ranges::find_if`](algorithm/ranges_find_if.md) | 条件を満たす最初の要素を検索する | C++20 |
151151
| [`ranges::find_if_not`](algorithm/ranges_find_if_not.md) | 条件を満たしていない最初の要素を検索する | C++20 |
152+
| [`ranges::find_last`](algorithm/ranges_find_last.md) | 指定された値を末尾から検索する | C++23 |
153+
| [`ranges::find_last_if`](algorithm/ranges_find_last_if.md) | 条件を満たす最後の要素を検索する | C++23 |
154+
| [`ranges::find_last_if_not`](algorithm/ranges_find_last_if_not.md) | 条件を満たしていない最後の要素を検索する | C++23 |
152155
| [`ranges::find_end`](algorithm/ranges_find_end.md) | 指定された最後のサブシーケンスを検索する | C++20 |
153156
| [`ranges::find_first_of`](algorithm/ranges_find_first_of.md) | ある集合の1つとマッチする最初の要素を検索する | C++20 |
154157
| [`ranges::adjacent_find`](algorithm/ranges_adjacent_find.md) | 隣接する要素で条件を満たしている最初の要素を検索する | C++20 |
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# find_last
2+
* algorithm[meta header]
3+
* std::ranges[meta namespace]
4+
* function template[meta id-type]
5+
* cpp23[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template <forward_iterator I,
10+
sentinel_for<I> S,
11+
class T,
12+
class Proj = identity>
13+
requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
14+
constexpr ranges::subrange<I>
15+
find_last(I first,
16+
S last,
17+
const T& value,
18+
Proj proj = {}); // (1) C++23
19+
20+
template <forward_range R,
21+
class T,
22+
class Proj = identity>
23+
requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
24+
constexpr ranges::borrowed_subrange_t<R>
25+
find_last(R&& r,
26+
const T& value,
27+
Proj proj = {}); // (2) C++23
28+
}
29+
```
30+
* forward_iterator[link /reference/iterator/forward_iterator.md]
31+
* sentinel_for[link /reference/iterator/sentinel_for.md]
32+
* borrowed_iterator_t[link /reference/ranges/borrowed_iterator_t.md]
33+
* iterator_t[link /reference/ranges/iterator_t.md]
34+
* identity[link /reference/functional/identity.md]
35+
* indirect_binary_predicate[link /reference/iterator/indirect_binary_predicate.md]
36+
* ranges::equal_to[link /reference/functional/ranges_equal_to.md]
37+
* forward_range[link /reference/ranges/forward_range.md]
38+
* projected[link /reference/iterator/projected.md]
39+
40+
## 概要
41+
指定された値を末尾から検索する。
42+
43+
- (1): イテレータ範囲を指定する
44+
- (2): Rangeを直接指定する
45+
46+
47+
## 戻り値
48+
`[first,last)` あるいは `r` 内のイテレータ i について、[`invoke`](/reference/functional/invoke.md)`(proj, *i) == value` であるような最後のイテレータ `i` を `ranges::subrange<I>{i, last}` として返す。そのようなイテレータが見つからなかった場合は `ranges::subrange<I>{last, last}` を返す。
49+
50+
## 計算量
51+
最大で `last - first` 回比較を行う
52+
53+
54+
## 例
55+
```cpp example
56+
#include <algorithm>
57+
#include <array>
58+
#include <iostream>
59+
60+
int main() {
61+
constexpr std::array v = { 3, 1, 4, 1, 5 };
62+
const auto result = std::ranges::find_last(v, 1);
63+
if (result.begin() == v.end()) {
64+
std::cout << "not found" << std::endl;
65+
} else {
66+
std::cout << "found: " << *result.begin() << std::endl;
67+
std::cout << " pos: " << std::distance(v.begin(), result.begin()) << std::endl;
68+
}
69+
}
70+
```
71+
* std::ranges::find_last[color ff0000]
72+
73+
### 出力
74+
```
75+
found: 1
76+
pos: 3
77+
```
78+
79+
80+
## バージョン
81+
### 言語
82+
- C++23
83+
84+
### 処理系
85+
- [Clang](/implementation.md#clang): ??
86+
- [GCC](/implementation.md#gcc): 13.2
87+
- [ICC](/implementation.md#icc): ??
88+
- [Visual C++](/implementation.md#visual_cpp): ??
89+
90+
## 参照
91+
- [P1223R5 find_last](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1223r5.pdf)
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# find_last_if
2+
* algorithm[meta header]
3+
* std::ranges[meta namespace]
4+
* function template[meta id-type]
5+
* cpp23[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template <forward_iterator I,
10+
sentinel_for<I> S,
11+
class Proj = identity,
12+
indirect_unary_predicate<projected<I, Proj>> Pred>
13+
constexpr ranges::subrange<I>
14+
find_last_if(I first,
15+
S last,
16+
Pred pred,
17+
Proj proj = {}); // (1) C++23
18+
19+
template <forward_range R,
20+
class Proj = identity,
21+
indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
22+
constexpr ranges::borrowed_subrange_t<R>
23+
find_last_if(R&& r,
24+
Pred pred,
25+
Proj proj = {}); // (2) C++23
26+
}
27+
```
28+
* forward_iterator[link /reference/iterator/forward_iterator.md]
29+
* sentinel_for[link /reference/iterator/sentinel_for.md]
30+
* borrowed_iterator_t[link /reference/ranges/borrowed_iterator_t.md]
31+
* iterator_t[link /reference/ranges/iterator_t.md]
32+
* identity[link /reference/functional/identity.md]
33+
* indirect_unary_predicate[link /reference/iterator/indirect_unary_predicate.md]
34+
* forward_range[link /reference/ranges/forward_range.md]
35+
* projected[link /reference/iterator/projected.md]
36+
37+
## 概要
38+
範囲の中から、指定された条件を満たす最後の要素を検索する。
39+
40+
* (1): イテレータ範囲を指定する
41+
* (2): Rangeを直接指定する
42+
43+
44+
## 戻り値
45+
`[first,last)` あるいは `r` 内のイテレータ `i` について、[`invoke`](/reference/functional/invoke.md)`(pred, `[`invoke`](/reference/functional/invoke.md)`(proj, *i)) != false` である最後のイテレータ `i` を `ranges::subrange<I>{i, last}` として返す。そのようなイテレータが見つからなかった場合は `ranges::subrange<I>{last, last}` を返す。
46+
47+
48+
## 計算量
49+
最大で `last - first` 回述語による比較を行う
50+
51+
52+
## 例
53+
```cpp example
54+
#include <algorithm>
55+
#include <array>
56+
#include <iostream>
57+
58+
int main() {
59+
constexpr std::array v = { 3, 1, 4, 1, 5 };
60+
const auto result = std::ranges::find_last_if(v, [](int x) { return x == 1; });
61+
if (result.begin() == v.end()) {
62+
std::cout << "not found" << std::endl;
63+
} else {
64+
std::cout << "found: " << *result.begin() << std::endl;
65+
std::cout << " pos: " << std::distance(v.begin(), result.begin()) << std::endl;
66+
}
67+
}
68+
```
69+
* std::ranges::find_last_if[color ff0000]
70+
71+
### 出力
72+
```
73+
found: 1
74+
pos: 3
75+
```
76+
77+
## バージョン
78+
### 言語
79+
- C++23
80+
81+
### 処理系
82+
- [Clang](/implementation.md#clang): ??
83+
- [GCC](/implementation.md#gcc): 13.2
84+
- [ICC](/implementation.md#icc): ??
85+
- [Visual C++](/implementation.md#visual_cpp): ??
86+
87+
## 参照
88+
- [P1223R5 find_last](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1223r5.pdf)
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# find_last_if_not
2+
* algorithm[meta header]
3+
* std::ranges[meta namespace]
4+
* function template[meta id-type]
5+
* cpp23[meta cpp]
6+
7+
```cpp
8+
namespace std::ranges {
9+
template <forward_iterator I,
10+
sentinel_for<I> S,
11+
class Proj = identity,
12+
indirect_unary_predicate<projected<I, Proj>> Pred>
13+
constexpr ranges::subrange<I>
14+
find_last_if_not(I first,
15+
S last,
16+
Pred pred,
17+
Proj proj = {}); // (1) C++23
18+
19+
template <forward_range R,
20+
class Proj = identity,
21+
indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
22+
constexpr ranges::borrowed_subrange_t<R>
23+
find_last_if_not(R&& r,
24+
Pred pred,
25+
Proj proj = {}); // (2) C++23
26+
}
27+
```
28+
* forward_iterator[link /reference/iterator/forward_iterator.md]
29+
* sentinel_for[link /reference/iterator/sentinel_for.md]
30+
* borrowed_iterator_t[link /reference/ranges/borrowed_iterator_t.md]
31+
* iterator_t[link /reference/ranges/iterator_t.md]
32+
* identity[link /reference/functional/identity.md]
33+
* indirect_unary_predicate[link /reference/iterator/indirect_unary_predicate.md]
34+
* forward_range[link /reference/ranges/forward_range.md]
35+
* projected[link /reference/iterator/projected.md]
36+
37+
## 概要
38+
範囲の中から、指定された条件を満たさない最後の要素を検索する。
39+
40+
- (1): イテレータ範囲を指定する
41+
- (2): Rangeを直接指定する
42+
43+
44+
## 戻り値
45+
`[first,last)` あるいは `r` 内のイテレータ `i` について、[`invoke`](/reference/functional/invoke.md)`(pred, `[`invoke`](/reference/functional/invoke.md)`(proj, *i)) == false` である最後のイテレータ `i` を `ranges::subrange<I>{i, last}` として返す。そのようなイテレータが見つからなかった場合は `ranges::subrange<I>{last, last}` を返す。
46+
47+
48+
## 計算量
49+
最大で `last - first` 回述語による比較を行う
50+
51+
52+
## 例
53+
```cpp example
54+
#include <algorithm>
55+
#include <array>
56+
#include <iostream>
57+
58+
int main() {
59+
constexpr std::array v = { 3, 1, 4, 1, 5 };
60+
const auto result = std::ranges::find_last_if_not(v, [](int x) { return x != 1; });
61+
if (result.begin() == v.end()) {
62+
std::cout << "not found" << std::endl;
63+
} else {
64+
std::cout << "found: " << *result.begin() << std::endl;
65+
std::cout << " pos: " << std::distance(v.begin(), result.begin()) << std::endl;
66+
}
67+
}
68+
```
69+
* std::ranges::find_last_if_not[color ff0000]
70+
71+
### 出力
72+
```
73+
found: 1
74+
pos: 3
75+
```
76+
77+
## バージョン
78+
### 言語
79+
- C++23
80+
81+
### 処理系
82+
- [Clang](/implementation.md#clang): ??
83+
- [GCC](/implementation.md#gcc): 13.2
84+
- [ICC](/implementation.md#icc): ??
85+
- [Visual C++](/implementation.md#visual_cpp): ??
86+
87+
## 参照
88+
- [P1223R5 find_last](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1223r5.pdf)

0 commit comments

Comments
 (0)