2

我有一个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

我能怎么做?

4

2 回答 2

3

正如 Bo 评论的那样,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
}
于 2012-06-29T21:00:31.907 回答
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 是 npos 或大于 size(),则需要将其设置为 size()。

PS:我认为这个问题可以从一些编辑中受益。对于一个“find_first_of_not_reverse”来说,这是非常具有误导性的。我认为应该是 rfind_first_of (然后在结果中加 1。)

于 2014-07-10T08:11:01.590 回答