0

私はまだ C++ を学んでいますが、理解しにくい式を見つけました。

基本的には、cin 入力を istringstream に取り、それを処理して個々の単語を保持し、そのカウント (出現回数) をマップ コンテナーの「words」に格納します。

コード

std::map<string, int> words;

std::istream_iterator<string> begin(cin); 
std::istream_iterator<string> end;

while(begin != end ) 
   words[*begin++]++;

誰かが while ループのコードを説明してくれたら? 私は最終結果を知っています。それがどのように正確に行われるかを知りたいだけです。ありがとう!

4

4 に答える 4

3
  1. *開始 - イテレータ値を取得
  2. *begin++ - その後、反復子をインクリメントします
  3. words[*begin++] - ステップ 1 の値をマップ [] 演算子に渡します。これは、キーによって値を取得することを意味します。
  4. words[*begin++]++ - その値を増やします。

cin からのすべての文字列について、マップ内の int を検索し、それをインクリメントします。等しい文字列を数えているようです。

于 2013-10-18T21:03:11.727 に答える
3

についてstd::istream_iterator<T>:この型は、I/O をストリーミングするための反復子インターフェイスを提供します。ここで、beginとはイテレータです (の入力で表される、 のend「仮想」コンテナ内のイテレータと考えることができます)。stringcin

beginは で初期化されるためcin、私が「アクティブな」イテレータと呼ぶものになります。cin最初に逆参照されたとき ( のように)から読み取られ、*begin事前または事後インクリメント ( begin++.

は何も初期化されていないためend、アクティブな反復子ではなく、特別な「終了マーカー」反復子になります。この特別なイテレータ値の唯一の目的は、アクティブなイテレータがファイルの最後に到達したときに等しいものと比較できるようにすることです。

このようにして、ファイルからの一連のT(この場合はstring) の読み取りは、コンテナの通常のイテレータ トラバーサルに押し込むことができます :)

[編集: の動作を明確にしoperator[]()ました。]

に関してstd::map<string, int>マップは、小さな整数以外のもの(この場合は文字列)によってインデックス付けできる非常に一般的なタイプの配列と考えることができます。std::map<K, T>型オーバーロードはoperator[]()、キー引数によって識別される既存の要素への参照を返します。マップにそのキーを持つ要素が存在しない場合、デフォルト値が追加されるという追加の (ここにあるように、しばしば役立つ) 機能があります。 ( の場合は 0 int) であり、この新しい要素への参照が返されます。

于 2013-10-18T21:04:03.877 に答える
3

圧縮されたワンライナーを理解できない場合は、複数の行に分割して中間結果を保存してください。

std::map<std::string, int> words;

std::istream_iterator<std::string> begin(std::cin); 
//default constructor creates an end of stream iterator
std::istream_iterator<std::string> end_of_stream; 

while(begin != end_of_stream ){
    std::string from_cin = *begin;     //reads from std::cin 
    int &count_ref = words[from_cin];  //can create a new entry 
    count_ref++;                       //increment value in the map
    begin++;                           //advance the stream_iterator
}

正確なセマンティクスを参照するための関連ページは、

isstream_iterator コンストラクター

isstream_iterator 演算子 *

マップ演算子 []

于 2013-10-18T21:06:26.417 に答える