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

时间:2016-08-26 11:39:22

标签: c++ c++11 vector stl stl-algorithm

我有这个要求找到向量中小于值的最后一个元素。

和find_first_of一样,但不是我想要的最后一次。 我搜索并发现没有find_last_of但是有find_first_of。

为什么会这样?标准方法是使用find_first_of和反向迭代器吗?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

这是反向迭代器的完成方式:

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; })); 

答案 2 :(得分:1)

只有一件事。如果您希望找到包含谓词元素的范围的尾端,请注意谓词:

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,

答案 3 :(得分:0)

从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;
}