C++ Logo

std-proposals

Advanced search

Re: Finding the index of an element (std::find_first_index)

From: Barry Revzin <barry.revzin_at_[hidden]>
Date: Sun, 4 Oct 2020 22:23:43 -0500
On Sun, Oct 4, 2020 at 10:08 PM Arthur O'Dwyer via Std-Proposals <
std-proposals_at_[hidden]> wrote:

>
> Agreed.
> Btw, I've been mostly convinced that this algorithm is not needed (not
> even in theory) by the slightly handwavey example given earlier in this
> thread, of composing it out of the `enumerate` view which has a decent
> chance of getting into C++23. Here's the example worked out:
> https://godbolt.org/z/YE4f7T
>
> template<class R, class Pred>
> size_t find_index(R&& r, Pred pred)
> {
> auto e = ranges::views::enumerate(r);
> auto getSecond = [](auto&& x) -> decltype(auto) { return (x.second); };
> return (*std::ranges::find_if(e, pred, getSecond)).first;
> }
>
> This is not elegant code *at all*, but at least it shows that it's
> possible to get integer indices out of Ranges algorithms, if you really
> need integers, and without doing two passes.
>
> –Arthur
>

More straightforward to use take_while:

template <typename R, typename Pred>
auto count_while_not(R&& r, Pred&& pred) {
    return
 ranges::distance(r | ranges::views::take_while(std::not_fn(pred)));
}

Barry

Received on 2020-10-04 22:23:57