【问题标题】:Is there an STL algorithm to find the last instance of a value in a sequence?是否有 STL 算法来查找序列中值的最后一个实例?
【发布时间】:2010-12-29 16:17:01
【问题描述】:

使用 STL,我想在一个序列中找到某个值的最后一个实例。

此示例将在整数向量中找到 0 的 第一个实例。

#include <algorithm>
#include <iterator>
#include <vector>

typedef std::vector<int> intvec;
intvec values;
// ... ints are added to values
intvec::const_iterator split = std::find(values.begin(), values.end(), 0);

现在我可以使用split 对子范围begin() .. splitsplit .. end() 执行操作。我想做类似的事情,但将拆分设置为 0 的 last 实例。我的第一直觉是使用反向迭代器。

intvec::const_iterator split = std::find(values.rbegin(), values.rend(), 0);

这不起作用,因为split 是错误的迭代器类型。所以...

intvec::const_reverse_iterator split = std::find(values.rbegin(), values.rend(), 0);

但现在的问题是我无法制作像 begin(), splitsplit, end() 这样的“头”和“尾”范围,因为它们不是反向迭代器。有没有办法将反向迭代器转换为相应的正向(或随机访问)迭代器?有没有更好的方法来查找序列中元素的最后一个实例,以便留下兼容的迭代器?

【问题讨论】:

    标签: c++ algorithm stl find


    【解决方案1】:

    但现在的问题是我不能 使用“头”和“尾”范围 begin() 和 end() 因为它们不是 反向迭代器。

    reverse_iterator::base() 是您正在寻找的 - 在SGIs reverse_iterator descriptionhere on cppreference.com 上的新成员部分

    【讨论】:

    • 请注意,reverse_iterator::base() 并不指向同一个元素,而是指向找到的项目之后的元素。 Scott Meyer 在本文的准则 3 中表达得最好:ddj.com/cpp/184401406
    • std::reverse_iterator::base cppreference 处的条目
    【解决方案2】:

    std::find_end 呢? (查找序列的最后一次出现)

    【讨论】:

    • +1 表示有趣的方法。寻找一个元素的最后一个子序列肯定会起作用。但是将反向迭代器转换为它的基类型更有效。
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多