我有一个std::string
,我想找到第一个角色的位置:
' '
,'\n'
和'\t'
。所以,例如,如果我有以下string
和位置:
string str("AAA BBB=CCC DDD");
size_t pos = 7;
我希望有可能使用这样的方法:
size_t res = find_first_of_not_reverse(str, pos, " \n\t");
// now res = 4, because 4 is the position of the space character + 1
我该怎么办?
答案 0 :(得分:3)
正如博评论的那样,templatetypedef的回答是99%的回答;我们只需要std::string::find_last_of
而不是std::string::find_last_not_of
:
#include <cassert>
#include <string>
std::string::size_type find_first_of_not_reverse(
std::string const& str,
std::string::size_type const pos,
std::string const& chars)
{
assert(pos > 1);
assert(pos < str.size());
std::string::size_type const res = str.find_last_of(chars, pos - 1) + 1;
return res == pos ? find_first_of_not_reverse(str, pos - 1, chars)
: res ? res
: std::string::npos;
}
int main()
{
std::string const str = "AAA BBB=CCC DDD";
std::string const chars = " \n\t";
std::string::size_type res = find_first_of_not_reverse(str, 7, chars); // res == 4
res = find_first_of_not_reverse(str, 2, chars); // res == npos
}
答案 1 :(得分:1)
我很好奇为什么basic_string没有自己定义rfind_first_of和朋友。我认为应该。无论如何,这是一个非递归(参见ildjarn的答案)实现,它应该满足这个问题的要求。它编译但我没有测试过。
std::string delims = " \n\t";
reverse_iterator start = rend()-pos-1, found =
std::find_first_of(start,rend(),delims.begin(),delims.end());
return found==rend()?npos:pos-(found-start);
如果rfind pos需要设置为size(),如果它是npos或大于size()。
PS:我认为这个问题可以从一些编辑中受益。对于一个&#34; find_first_of_not_reverse&#34;很误导。它应该是rfind_first_of我认为(然后在结果中加1)。