4

我正在阅读“Ivor Horton 的 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

他同时做两件事,而且通常比他需要的聪明。

  1. 他正在获取迭代器指向的值,然后递增迭代器。所以,解释*begin++*(begin++)。但是请注意,它是一个后增量,因此增量发生在取消引用之后。

  2. 他正在增加地图中给定键的值。当您取消引用迭代器时,您会得到一个字符串。此字符串用作words地图的键,其值递增。

分布在更多行上,它看起来像这样:

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