4

「Ivor Horton's Beginning Programming Visual C++ 2010」を読んでいて、第 10 章の標準テンプレート ライブラリにいます。私の問題はマップコンテナにありmap<Person, string> mapnameます。この本は、要素を追加する多くの方法を示してくれpair<K, T>ましmake_pair()mapname.insert(pair)。しかし突然、彼は次のコードで使用される要素追加手法を導入しました。

int main()
{
    std::map<string, int> words
    cout << "Enter some text and press Enter followed by Ctrl+Z then Enter to end:"
        << endl << endl;

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

    while(being != end)   // iterate over words in the stream
        //PROBLEM WITH THIS LINE:
        words[*begin++]++;  // Increment and store a word count

    //there are still more but irrelevant to this question)
}

示された行は私の問題です。wordsそれがマップであることは理解していますが、そのような初期化は見たことがありません。そして、その増分で何が起こっているのか。Ivor Horton はこれをさらに詳しく説明できなかったと思います。あるいは、少なくとも、私のような初心者を驚かせないように十分な説明をするべきでした。

4

2 に答える 2

5

あなたはそのような地図を持っています:

sts::map<std::string, int> m;

アクセス演算子[key]は、そのキーで格納されている要素への参照を提供するか、存在しない場合は挿入します。したがって、空のマップの場合、これは

m["hello"];

キー "Hello" と値 0 を持つエントリをマップに挿入します。また、値への参照も返します。したがって、直接インクリメントできます。

m["Bye"]++;

キー「Bye」の下に値 0 を挿入して 1 ずつ増やすか、既存の値を 1 ずつ増やします。

[]オペレーターの内部で起こっていることに関しては、

*begin++

istream_iteratorをインクリメントし、インクリメントの前に値を逆参照する手段です。

begin++;

インクリメントbeginして、インクリメント前の値を返します

*someIterator

イテレータを逆参照します。

于 2012-05-09T06:53:28.987 に答える
1

彼は一度に 2 つのことを行っており、一般的に必要以上に賢くなっています。

  1. 彼は反復子が指す値を取得してから、反復子をインクリメントしています。したがって、 と解釈*begin++*(begin++)ます。ただし、これはポストインクリメントであるため、逆参照の後にインクリメントが発生することに注意してください。

  2. 彼は、マップ内の指定されたキーの値を増やしています。イテレータを逆参照すると、文字列が得られます。この文字列はマップのキーとして使用されwords、その値がインクリメントされます。

より多くの行に展開すると、次のようになります。

std::string x = *begin;
begin++;
words[x] += 1;
于 2012-05-09T06:58:35.407 に答える