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

C++ 查找std::vector中满足条件的最后一个元素,c++,c++11,vector,stl,stl-algorithm,C++,C++11,Vector,Stl,Stl Algorithm,我需要找到向量中小于某个值的最后一个元素 比如先找,但我要最后找。 我搜索了一下,发现没有最后一个,但有第一个 为什么会这样?标准方法是将find_first_of与反向迭代器一起使用吗 这是如何使用反向迭代器完成的: 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

我需要找到向量中小于某个值的最后一个元素

比如先找,但我要最后找。 我搜索了一下,发现没有最后一个,但有第一个


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

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

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; })); 
std::vector vec={2,3,10,5,7,11,3,6};
//以下输出“3”:
std::cout使用,如下所示:

#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';
}
#包括
#包括
int main()
{
std::向量v{1,2,42,42,63};
自动结果=std::find_if(v.rbegin(),v.rend(),
[](int i){return i==42;});

std::cout只有一件事。如果要查找包含谓词元素的范围的末尾,请小心谓词:

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, ", "));
}
从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;
}
模板内联
双向运算符find_last(常量双向运算符first,常量
双向运算符(最后一个,常数和值)
{
for(双向运算符it=last;it!=first;)
//反向迭代:1.检查2.减量3.评估
{
--它//
如果(*it==值)
归还它;
}    
最后返回;
}

是的,使用反向迭代器。您可能希望在正常代码中解除限制之前检查结果。当然。以上仅用于说明目的。最后一行应该是std::cout@Akshay,这将导致一个负数,我需要到数组开头的距离。这不会编译。您无法比较迭代器和反向迭代器。t他链接的演示包含正确的代码。我在帖子中对齐了代码。
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;
}