一、插入相同键元素操作
(1)insert方法
在map中的键必须是唯一的,当想map中连续插入键相同但值不同的元素时,编译和运行时都不会发生任何错误,系统会忽略后面的对已存在的键的插入操作,如
1 map<int,int> m1; 2 m1.insert(make_pair(1,2)); 3 m1.insert(make_pair(1,3)); 4 for(map<int,int>::iterator mit=m1.begin();mit!=m1.end();mit++){ 5 cout<<mit->first<<":"<<mit->second<<endl; 6 }
在第二行和第三行分别插入键都为1,但值不同的数据,此操作会忽略第三行的插入操作,其程序运行结果为:
1:2
通过insert方法插入操作容易误解:
1. 认为插入相同键的操作会报错(正解:插入相同键的操作,无论是编译和运行时都不会报错)
2. 对插入相同键的数据时,后面的插入操作的值会覆盖前面的值,例如会误认为该例子中第三句的插入操作会使最终键为1的数据对应的值会被修改为3(正解:对于插入的数据的键值已存在,那么这个插入操作将会被忽略)
(2)通过下标操作
向map中插入元素还可以用数组(关联数组)下标的方式,先看下面的例子
1 map<int,int> m1; 2 m1[1]=2; 3 m1[1]=3; 4 for(map<int,int>::iterator mit=m1.begin();mit!=m1.end();mit++){ 5 cout<<mit->first<<":"<<mit->second<<endl; 6 }
运行结果
1:3
这段代码与insert示例中的代码差别只在第2,3行,而从结果上看通过下标方式插入元素操作后面的赋值操作覆盖了前面的赋值操作。稍后会进一步对下标操作进行分析。
二、查找并读取map中的元素
map容器最大的优点就在于它可以快速定位并读取某一键值的元素。
(1)通过下标查找
如下代码所示
1 map<string,int> m1; 2 cout<<m1["abc"]<<endl; 3 m1["abc"]=8; 4 cout<<m1["abc"]<<endl;
运行结果:
0 8
由上面的代码可以看到,我们可以非常方便的通过数组下标的方式对map中的元素进行访问。但你可能对第2行的输出会有一些疑惑,因为最初map是空的,直接读取一个不存在的键,其居然会有正常的输出结果(可能并不是我们想要的),而之前我们并没有对该键进行任何赋值操作。
解释下标索引的机制
用下标访问map中不存在的元素时,将导致向map中添加该下标所指向的新元素,其值会根据类型默认值或默认构造函数进行初始化(如int或初始化为0,string初始化为“”)。
(2)通过方法count()和find()查找
因此,如果判断map中是否存在某键值的元素,一般不能通过取下标的方式判断,因为这样会想map中添加新元素。map标准库中提供了两种判断某键值的元素是否存在的方法,count()方法和find()方法,如下表
map::count(k) | 返回map中键k出现的次数,这里只能取0(不存在)和1(存在) |
map::find(k) | 如果容器中存在按k的索引元素,则返回指向该元素的迭代器。如果不存在则返回超出末端的迭代器 |
这两种方法不会向map中插入新元素,因此对map索引键判断时,应选用这两种方法。