2

QStringに基づいて a の文字を置き換える必要がありQChar::categoryます。stdlibの用語で私がしたい

string.erase(std::remove_if(begin(string), end(string), 
                            [](QChar c) { 
                            QChar::Category cat = c.category(); 
                            return cat == .... || cat == ...; }), 
             string.end());

別の方法として、Unicode 文字カテゴリで機能する regexp に満足していますQString::replace

それは QString で可能ですか、それとも文字列std::vector<QChar>を逆にする必要がありますか?

編集:保持したいカテゴリ:

  • 最初の文字: $、_、または Unicode カテゴリの任意の文字「大文字 (Lu)」、「小文字 (Ll)」、「タイトル文字 (Lt)」、「修飾文字 (Lm)」、「その他」文字 (Lo)」、または「文字番号 (Nl)」</li>
  • 残りの部分: 最初の黒丸に加えて、U+200C ゼロ幅の非結合文字、U+200D ゼロ幅の結合文字、および Unicode カテゴリの文字「非間隔マーク (Mn)」、「間隔結合マーク (Mc)」 」、「10 進数 (Nd)」、または「コネクタ句読点 (Pc)」。

複数のパスでファースト/レストを実行できます。

4

1 に答える 1

4

Qt は、そのようなことを行うための独自の方法を提供します。良いかどうかは疑問ですが、Qtの慣用句は

QString result;
result.reserve(string.size());
foreach (const QChar& c, string) {
    if (is_good(c)) {
        result += c;
    }
}

もちろん、ラムダでそれを行うことができますstd::for_each

std::for_each(string.begin(), string.end(),
                  [&result](QChar c)
                    {
                        if (is_good(c)) {result += c; }
                    }
    );

しかし、それはQt慣用的ではありません。

文字列からシンボルを削除するのは遅く、スペースが予約されている場合は新しいものを追加するのが遅いことに注意してください。これが、最初のコード サンプルが高速である理由です。

于 2012-02-22T18:38:04.047 に答える