|
| 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