如何在给定起始位置之前找到容器中的元素?

How to find an element in a container before a given starting position?

我想找到某个元素在容器中出现的某个给定起始位置之前的 last 次。

例如,如果我试图在字符串 's' 中找到给定字符之前的最后一个 space,我相信显而易见的方法类似于:

string::const_iterator b;
b = i; // <-- 'i' specifies where to start looking
while ((b != s.begin()) && (b[-1] != ' '))
    b--;

有没有更好的方法使用 STL 算法来做到这一点?


我试过:

b = find(string::const_reverse_iterator(i),
string::const_reverse_iterator(s.begin()), " ").base();

但我不确定这是否按预期工作。

您可以使用 std::string::find_last_of 并指定它应该搜索的位置不超过。下面会找到单词test前第一个space的位置。

#include <iostream>
#include <string>

int main()
{
    std::string foo = "this is a test string";
    auto pos = foo.find_last_of(" ", foo.find("test", 0));
    std::cout << pos;
    std::cin.get();
    return 0;
}

输出:

9

出于通用目的,我想我会使用 std::find_end 和足够的 lambda 函数。页面上的示例很好地说明了函数的行为。

反向迭代器解决方案将起作用:

#include <iostream>
#include <algorithm>

int main()
{
    using std::string;
    using const_iterator = string::const_iterator;
    using const_reverse_iterator = string::const_reverse_iterator;
    string s("This is an sample");
    const_iterator pos = s.begin() + s.find("sample");
    const_reverse_iterator result = std::find(const_reverse_iterator(pos), s.crend(), 's');
    std::cout << string(s.cbegin(), result.base()) << '\n';
}

但是,您可能更喜欢@NathanOliver 的解决方案。