3

C++標準ライブラリのメンバー関数string::find_first_ofを使用すると、空のサブ文字列を検索できます。

 s.find_first_of(c, s.size())

また

s.find_first_of(c, string::npos)

string::find_last_ofただし、 ;を使用して空の部分文字列を検索することはできません。次の呼び出しは、最初の文字(のみ)を含む部分文字列を検索します。

 s.find_last_of(c, 0)

これはC++標準ライブラリの欠陥だと思いますね。

4

1 に答える 1

4

ここでは非対称性は見られません。実際にはまったく逆で、完全に対称的であるように見えます。ある開始位置から右find_first_ofへの検索と考えてください。一方、ある開始位置からへの検索と考えてください。find_last_of

名前には誤解を招くような性質があります。最初の出現ではなく最後の出現を返すことを除いてfind_last_of、自然な前方検索を意味します。ただし、双方向シーケンスでは、名前の「前方」の性質を無視して、後方検索と考えることができます。後方検索も最初の出現を返し、開始点からに進むだけです。この観点から、関数は。と対称find_first_ofです。

編集:あなたのコメントを読んだ後、私はついにあなたのポイントを理解しました。したがって、問題は、posパラメータの現在のセマンティクスにより、の空の検索領域を指定できないことですfind_last_of。はい、それは理にかなっています。find_last_of私は同意します、それは確かにデザインの矛盾として見ることができるものです。

find_last_of一貫性を保つために、私は実際には価値に関して包括的ではないと予想しposます。その場合、xposによって返される目標位置の指定は次のfind_last_ofようになります。

xpos<posおよびxpos<size();

その場合s.find_last_of(c, 0)、空のプレフィックスをs.find_last_of(c, s.size())検索し、文字列全体を検索します。

しかし、標準は言う

xpos <=posおよびxpos<size();

なぜ彼らがposパラメータにそのような包括的な意味を与えることにしたのか私は本当に知りません。おそらく彼らはそれが理解しやすくなるだろうと思ったのでしょう。

于 2013-02-07T09:22:30.920 に答える