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

时间:2015-07-02 19:04:28

标签: c++ stl containers

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

例如,如果我试图找到字符串''中给定字符之前的最后一个空格,我相信显而易见的方法就像:

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

但我不确定这是否符合预期。

3 个答案:

答案 0 :(得分:2)

您可以使用std::string::find_last_of并指定搜索距离不超过的位置。以下将在单词test之前找到第一个空格的位置。

#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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

#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的解决方案。