c++ 查找std::vector中满足条件的最后一个元素

h9vpoimq  于 2023-04-08  发布在  其他
关注(0)|答案(4)|浏览(255)

我需要找到向量中最后一个小于某个值的元素。
像find_first_of,但不是first,我想要last。我搜索发现没有find_last_of,但有find_first_of。
为什么会这样呢?标准的方法是使用find_first_of和反向迭代器吗?

bq3bfh9z

bq3bfh9z1#

使用reverse iterators,如下所示:

#include <iostream>
#include <vector>

int main()
{
  std::vector<int> v{1,2,42,42,63};
  auto result = std::find_if(v.rbegin(), v.rend(),
                             [](int i) { return i == 42; });

  std::cout << std::distance(result, v.rend()) << '\n';
}

Live demo
对于C++20范围,这将成为

int main()
{
    std::vector<int> v{1,2,42,42,63};
    auto result = std::ranges::find_if(v | std::views::reverse,
                                       [](int i) { return i == 42; });

    std::cout << std::distance(result, v.rend()) << '\n';
}

Live demo

8wigbo56

8wigbo562#

这是如何使用反向迭代器完成的:

std::vector<int> vec = {2,3,10,5,7,11,3,6};  

//below outputs '3':
std::cout << *(std::find_if(vec.rbegin(), vec.rend(), [](int i) { return i < 4; }));
xxe27gdn

xxe27gdn3#

只有一件事。如果你想找到包含 predicate 元素的范围的尾端,请小心使用 predicate :

int main()
{
    std::vector<int> x { 0, 1, 2, 3, 4, 5 };

    // finds the reverse iterator pointing at '2'
    // but using base() to convert back to a forward iterator
    // also 'advances' the resulting forward iterator.
    // in effect, inverting the sense of the predicate to 'v >= 3'
    auto iter = std::find_if(std::make_reverse_iterator(x.end()),
                 std::make_reverse_iterator(x.begin()),
                 [](auto& v) { return v < 3; }).base();

    std::copy(iter,
              x.end(),
              std::ostream_iterator<int>(std::cout, ", "));
}

结果:

3, 4, 5,
7gcisfzg

7gcisfzg4#

ZenXml:

template <class BidirectionalIterator, class T> inline
BidirectionalIterator find_last(const BidirectionalIterator first, const 
BidirectionalIterator last, const T& value)
{
    for (BidirectionalIterator it = last; it != first;) 
    //reverse iteration: 1. check 2. decrement 3. evaluate
    {
        --it; //

        if (*it == value)
            return it;
    }    
    return last;
}

相关问题