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:この質問は、編集することで恩恵を受けると思います。1つの「find_first_of_not_reverse」はかなり誤解を招くものです。rfind_first_of である必要があると思います (そして、結果に 1 を追加します)。

于 2014-07-10T08:11:01.590 に答える