找到满足条件中的s td ::向量最后一个元素

问题描述 投票:0回答:4

我有这样的要求在其中找到比值向量的最后一个元素。

像find_first_of但不是第一,我想最后一次。我搜索,发现没有find_last_of但find_first_of。

为什么会这样?是标准的方式是与反向迭代器使用find_first_of?

c++ c++11 vector stl stl-algorithm
4个回答
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


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

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,

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.