【问题标题】:Find last element in std::vector which satisfies a condition在 std::vector 中找到满足条件的最后一个元素
【发布时间】:2017-01-03 01:48:31
【问题描述】:

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

与 find_first_of 类似,但不是第一个,而是最后一个。 我搜了一下,发现没有find_last_of但是有find_first_of。

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

【问题讨论】:

  • 是的,使用反向迭代器。

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


【解决方案1】:

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

【讨论】:

  • 最后一行应该是 std::cout
  • @Akshay 这将导致负数,我想要到数组开头的距离。
  • 这不会编译。您不能比较迭代器和反向迭代器。
  • 链接的演示包含正确的代码。我在帖子中对齐了代码。
【解决方案2】:

这是使用反向迭代器的方式:

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

【讨论】:

  • 您可能想在用普通代码取消引用之前检查结果。
  • 当然。以上仅供参考
  • 嗯,如果测试不是i
  • 是的,正如@Jarod42 指出的结果需要检查。如果未找到匹配项,您将得到 vec.rend() 作为结果(不应使用 * 取消引用)
【解决方案3】:

只有一件事。如果您要查找包含谓词元素的范围的尾部,请注意谓词:

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,

【讨论】:

    【解决方案4】:

    来自 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      相关资源
      最近更新 更多