C++10.3.5 map : : insert 的使用(下)(有不懂)

来源:互联网 发布:开淘宝网店怎么找货源 编辑:程序博客网 时间:2024/06/18 17:35

简介

  • 谨记 value_type是pair< const K, V>类型的同义词,K为键类型,V为键所关联的值的类型

  • map对象中一个给定键只对应一个元素。如果试图插入的元素所对应的键已经在容器中,则insert 将不做任何操作。

  • 通常来说,下标操作符返回左值。它返回的左值是特定键所关联的值。

  • 有别于vector或string类型,map下标操作符返回的类型与对map迭代器进行解引用获得的类型不相同。

  • map迭代器返回value_type类型的值—––包括const key_type 和mapped_type类型成员的pair对象;下标操作符返回一个mapped_type类型的值。

  • 带有一个键—值pair 形参的insert 版本将返回一个值:包含一个迭代器和一个bool 值的pair 对象。其中迭代器指向map中具有相应键的元素,而bool 值则表示是否插入了该元素。如果该元素已经在容器中,则其关联的值保持不变,返回bool值为false;如果该键不在容器中,则插入新元素,且bool值为true。

=============================================================================================

  • map 容器的insert成员与顺序容器的类似,但有一点要注意:必须考虑键的作用。键影响了实参的类型:插入单个元素的insert版本使用键–值 pair 类型的参数。

  • 类似的,对于参数为一对迭代器的版本,迭代器必须指向键–值 pair 类型的元素。另一个差别则是:map容器的接受单个值的insert版本的返回类型。

这里写图片描述

这里写图片描述

1、以insert代替下标运算

这里写图片描述
- 使用下标给map容器添加新元素时,元素的值部分将采用值初始化。通常,我们会立即为其赋值,其实就是对同一个对象进行初始化并赋值。而插入元素的另一个方法是:直接使用insert 成员

word_count.insert(map<string,int>::value_type("Anna",1));
  • 这个insert 函数的实参是 map< string,int>::value_type(“Anna”,1)。是一个新创建的pair 对象,将直接插入到map 容器中。谨记 value_type是pair< const K, V>类型的同义词,K为键类型,V为键所关联的值的类型

  • insert 的实参创建了一个适当的pair类型新对象,该对象将插入到map容器。

  • 在添加新的map元素时,使用insert 成员可避免使用下标操作符所带来的副作用:不必要的初始化。

    • 传递给insert 的实参相当笨拙,可用两种方式简化: 使用 make_pair 或 typedef
word_count.insert(make_pair("Anna",1));
typedef map<string,int>::value_type valType;word_count.insert(valType("Anna",1););

2、检测insert的返回值——–不是很懂!!!!!

  • map对象中一个给定键只对应一个元素。如果试图插入的元素所对应的键已经在容器中,则insert 将不做任何操作。

    • 含有一个或一对迭代器形参的insert 函数并不说明是否有或有多少个元素插入到容器中。

    • 但是,带有一个键—值pair 形参的insert 版本将返回一个值:包含一个迭代器和一个bool 值的pair 对象。其中迭代器指向map中具有相应键的元素,而bool 值则表示是否插入了该元素。如果该元素已经在容器中,则其关联的值保持不变,返回bool值为false;如果该键不在容器中,则插入新元素,且bool值为true。在这两种情况下,迭代器都将指向具有给定键的元素。

map<string,int> word_count;//定义一个空的mapstring word;while(cin>>word)   {pair<map<string,int>::iterator,bool> ret=word_count.insert(make_pair(word,1));    //新建一个pair对象ret,对象的第一个参数时map<string,int>::iterator的迭代器类型,第二个是bool类型,其中迭代器指向map中具有相应键的元素,bool值则表示是否插入了该元素。如果该键已在容器中,则关联的值保持不变,返回的bool为false,如果不在,则插入新元素,bool值为true,在这两种情况下,迭代器都将指向具有给定键的元素。 if(!ret.second)    ++ret.first->second;   }//对于每个单词,都尝试insert 它,并将它的值赋值为1 。if 语句检测insert函数返回值中的bool 值。如果该值为false,则表示没有做插入操作,按word索引的元素已在word_count中存在,此时,将该元素所关联的值加1 。

3、语法展开

  • ret的定义和自增运算可能比较难解释
pair<map<string,int>::iterator,bool> ret=word_count.insert(make_pair(word,1))
  • 解释上面这段代码

    • 很容器看出我们定义的是一个pair对象,second成员为bool类型。first成员是map

++((ret.first)->second);
  • ret存储insert函数返回的pair对象。该对象的first成员是一个map迭代器,指向插入的键
  • ret.first 从insert 返回的pair 对象中获取map 迭代器

  • ret.first->second对该迭代器进行解引用,获得一个value_type类型的对象,这个对象同样是pair 类型的,他的second 成员即为我们所添加的元素的值部分

  • ret.first->second实现该值的自增运算。归结起来,这个自增语句获取指向按word索引的元素的迭代器,并将该元素的值加1

总结:

在一个容器类型为map< string,int >的容器中插入元素,使用的insert 函数应具有怎样的参数类型和返回值类型

  • 参数类型为:pair < const string ,vector < int >>
  • 返回值类型为 :pair< map < string,int >::iterator,bool >
0 0
原创粉丝点击