2012-05-09 80 views
4

我在阅读“Ivor Horton的开始编程Visual C++ 2010”,我在第10章 - 标准模板库。我的问题是地图容器map<Person, string> mapname。这本书向我展示了很多添加元素的方法,例如pair<K, T>和稍后使用make_pair()函数和mapname.insert(pair)。但是他突然介绍了一种元素添加技术,用于以下代码:C++ map <K,T>初始化

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是地图,但我从来没有见过这样的初始化。随着它的增量,那件事情会发生什么。我相信艾弗尔顿没有进一步详细阐述这一点,或者至少他应该给予足够的介绍,不要对像我这样的新手感到惊讶。

+0

您有失踪';''后words' –

回答

5

你有这样的地图:

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

接入运营商[key]为您提供了存储与关键元素的引用,或插入一个,如果它不存在。因此,对于空地图,这个地图插入一个条目,其中键为“Hello”,值为0.它还返回对该值的引用。所以,你可以直接增加它:

m["Bye"]++; 

将插入一个0值下键“再见”,并通过一个增加它,或1

增加现有的值作为东西[]内部发生操作者,

*begin++ 

是增量之前递增istream_iterator和解除引用所述值的装置:

begin++; 

增量begin和增量

*someIterator 

解引用迭代器前返回值。

+0

谢谢你这么多,分步说明真的钉它。我希望这本书的作者这样解释它。 –

+0

@JoeyArnoldAndres如果这个答案是解决您的问题(或从多个正确的解决方案中获得最佳答案),那么[接受](http://meta.stackexchange.com/q/5234/162011)是正确的答案。 –

1

他一次做两件事,一般比他需要更聪明。

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

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

分布在更多的线,它看起来像这样:

std::string x = *begin; 
begin++; 
words[x] += 1;