std::string
にはfind
のメンバー機能があり、std::vector
と友だちにはメンバー機能がないのはなぜですか?なぜ `std :: string`は` find`メンバ関数を持っていますか?
文字列にstd::find
を使用すると何か問題がありますか?
std::string
にはfind
のメンバー機能があり、std::vector
と友だちにはメンバー機能がないのはなぜですか?なぜ `std :: string`は` find`メンバ関数を持っていますか?
文字列にstd::find
を使用すると何か問題がありますか?
これは主に歴史的な理由によるものですが、それだけではありません。
文字列ライブラリとSTL(A. Stepanovによって開発されたC++標準ライブラリの一部となったコンテナ/アルゴリズムライブラリ)は独自に開発され、異なる規則を採用しました。彼らは最終的には両方のC++標準ライブラリに収束しかし、C++標準は、これらの構文規則を統一する努力を行い、STLアルゴリズムとstring
Sを使用でき、クラスstring
は、begin()
としてメンバ関数を有している理由であると
他のメンバー機能(例えば、substr()
)とは別に、end()
。
以外の下位互換性から、とにかく、string
は、find()
としてメンバ関数を提供して別の理由があります:アクセスしたり、自分の要素を操作する汎用アルゴリズムで動作するように意図されているコンテナとは異なり、文字列がほとんどのように考えられているが、値はのコレクション(すなわち、char
のシーケンス)ではなく、値自体です。したがって、string
の値を操作するアルゴリズムをstring
クラスのメンバ関数にカプセル化することは理にかなっています。
したがって、C++標準ライブラリは、string
のこれらのビューの両方を、値のコレクションと値そのものとしてサポートしています。
UPDATE:あなたの最初の文の
ビット完全に間違っています「std::vector
や友人はそれがありませんが」。少なくとも、std::vector
の友人の範囲をstd::set
,std::multiset
、std::map
、std::multimap
、std::unordered_set
、およびstd::unordered_map
(つまり、C++標準ライブラリのほぼすべての関連するコンテナ)にまで延長してはいけません。
特定のデータ構造は実際には、インターフェース上にいくつかの一般的なSTLアルゴリズムのメンバ関数バージョンを持っています:これは、それらのアルゴリズムが特定のデータ構造の一般的なものよりも効率的な実装をしていることを示します。 find()
)、汎用アルゴリズムをそれらのデータ構造に全く適用することができないため(例えば、std::remove()
、がコンテナ内の値をに変更するため)、特殊な実装が必要であることを示します。
std::string::find
(*)のセマンティクスは、std::find
のセマンティクスとはまったく異なります。アルゴリズムの場合、それはstd::string
に適用すると、の文字がXの位置を見つけることになる場合、コンテナ内の要素を見つけるでしょう。(単一charT
かかり一の変形除く)
メンバ関数std::string::find
は、異なる目的を持って、彼らは、ストリング(すなわち、値の配列ではなく、単一の値)を求めます。
次の質問は、std::find
を呼び出すだけのときに、charT
がかかる1つのオーバーロードが存在する理由です。 Andyが答えたところで、STLと文字列ライブラリの実装が別々に行われました。イテレータは、std::string
コンポーネントに追加されました。イテレータがstd::string
に追加された時点で、このオーバーロードはすでに存在していましたが、セマンティクスはstd::find
とは少し異なり、イテレータの代わりに、の位置 。これは、他のものに関して実装することができないことを意味するものではなく、そのコードだけがより複雑になることを意味する。私と一緒に
(*)クマ...それはstd::basic_string<>
http://www.gotw.ca/gotw/084.htm – juanchopanza
@juanchopanzaすごいことは素晴らしいリンクで綴られたかのように
std::string
を読みます。 (非会員の友人がカプセル化を改善する方法について多くのことを学んだ。(著者から読まれなかった人は、std :: list、std :: vector、std: :文字列と標準ライブラリ全体を扱う1つの汎用関数になります)。 – nckturner