map的插入与迭代器
map.insert(…); //往容器插入元素,返回pair<iterator,bool>
map中插入元素的四种方式:
假设 map<int, string> mapStu;
方式一、通过pair的方式插入对象
mapStu.insert( pair<int,string>(1,“张三”) );
方式二、通过pair的方式插入对象
mapStu.inset(make_pair(2, “李四”));
方式三、通过value_type的方式插入对象
mapStu.insert( map<int,string>::value_type(3,“王五”) );
方式四、通过数组的方式插入值
mapStu[4] = “赵六”;
mapStu[5] = “小七";
例子:
#include <iostream>
#include <functional>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
int main()
{
map<int, string> mapStu;
//方式一 构造一个pair, 然后插入
pair<map<int, string>::iterator, bool> ret = mapStu.insert(pair<int, string>(1, "张三"));
if(ret.second == true)
{
cout<<"插入成功! value: "<<(*(ret.first)).second<<endl;
}
else
{
cout<<"插入失败! "<<endl;
}
//如果键存在, 则插入会失败
ret = mapStu.insert(pair<int, string>(1, "小张三"));
if(ret.second == true)
{
cout<<"插入小张三成功! value: "<<(*(ret.first)).second<<endl;
}
else
{
cout<<"插入小张三失败!"<<endl;
}
//方式二 使用make_pair
mapStu.insert(make_pair(2, "李四"));
//方式三 使用value_type, 相当于pair<int, string>
mapStu.insert(map<int, string>::value_type(3, "王五"));
//方式四 直接使用[]重载, 如果键值对已经存在, 则覆盖原值
mapStu[4] = "赵六";
mapStu[4] = "小赵六";
mapStu[5] = mapStu[6];
mapStu[7] = mapStu[4];
for(map<int, string>::iterator it = mapStu.begin(); it != mapStu.end(); it++)
{
cout<<"key: "<<(*it).first<<" value: "<<(*it).second<<endl;
}
system("pause");
return 0;
}
运行环境: vc++ 2010学习版
运行结果:
注意:
1)前三种方法,采用的是insert()方法,该方法返回值为pair<iterator,bool>
2)第四种方法非常直观,但碰到相同的键时会进行覆盖操作。比如插入key 为4的键值时,先在mapStu中查找主键为4的项,若不存在,则将一个键为4,值为默认初始化值的对组插入到mapStu中,然后再将值修改成“赵六”。若发现已存在4这个键,则修改这个键对应的value。
3)string strName = mapStu[8]; //取值操作或插入操作
4)只有当mapStu存在8这个键时才是正确的取操作,否则会自动插入一个实例,键为8,值为默认构造时的初始化值。
迭代器
map.begin(); //返回容器中第一个数据的迭代器。
map.end(); //返回容器中最后一个数据之后的迭代器。
map.rbegin(); //返回容器中倒数第一个元素的迭代器。
map.rend(); //返回容器中倒数最后一个元素的后面的迭代器。