首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ map<K,T> Initialization

C++ map<K,T> Initialization
EN

Stack Overflow用户
提问于 2012-05-09 14:44:56
回答 2查看 880关注 0票数 4

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

代码语言:javascript
复制
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没有进一步阐述这一点,或者至少他应该给出足够大的介绍,以免让我这样的新手感到惊讶。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-09 14:53:29

你有这样一个地图:

代码语言:javascript
复制
sts::map<std::string, int> m;

访问操作符[key]为您提供对与该键一起存储的元素的引用,如果该元素不存在,则插入一个元素。因此,对于一个空的地图,这个

代码语言:javascript
复制
m["hello"];

在映射中插入一个条目,键为"Hello“,值为0。它还返回对值的引用。所以你可以直接递增它:

代码语言:javascript
复制
m["Bye"]++;

将在键"Bye“下插入一个值0并将其递增1,或将现有值递增1。

至于[]运算符内部发生的事情,

代码语言:javascript
复制
*begin++

是一种递增istream_iterator并在递增前取消引用该值的方法:

代码语言:javascript
复制
begin++;

递增begin并返回递增前的值

代码语言:javascript
复制
*someIterator

取消对迭代器的引用。

票数 5
EN

Stack Overflow用户

发布于 2012-05-09 14:58:35

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

  1. ,他正在获取迭代器指向的值,然后递增迭代器。因此,将*begin++解释为*(begin++)。但请注意,这是一个后增量,因此增量是在dereference.
  2. He递增映射中给定键的值之后进行的。当您取消对迭代器的引用时,您会得到一个字符串。此字符串用作words映射的键,其值会递增。

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

代码语言:javascript
复制
std::string x = *begin;
begin++;
words[x] += 1;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10511009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档