2012-05-09 119 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;