C++10.3.5 map : : insert 的使用(下)(有不懂)
2015-06-10 17:00
405 查看
简介
谨记 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;//定义一个空的map string 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 >
相关文章推荐
- 聊天系统中的用户列表并发问题分析
- C语言 判断二叉树是不是平衡树
- C语言 判断二叉树是不是平衡树
- 第十四周 项目4-处理c++源代码的程序(1)
- C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
- c++默认的构造函数中调用带参数的构造函数
- C语言 打印路径节点值的和为指定和的所有路径
- 二叉排序树的C++实现
- C语言 打印从根节点到叶节点的所有路径
- 为什么C++程序无法打开相对路径的文件?
- C#调用C++的DLL各种问题
- C语言-编译
- C++头文件编译问题
- C++头文件编译问题 分类: C/C++ 2015-06-10 15:48 32人阅读 评论(0) 收藏
- 文件间的编译依存关系 分类: C/C++ 2015-06-10 15:37 34人阅读 评论(0) 收藏
- C++const成员规则
- c语言 文件操作
- C++ 实现链式栈
- 链栈的c++实现
- cocox2d-x HelloWorld分析