如何在给定起始位置之前找到容器中的元素?
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 的解决方案。
我想找到某个元素在容器中出现的某个给定起始位置之前的 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 的解决方案。