STL map&multimap 插入和迭代器

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();   //返回容器中倒数最后一个元素的后面的迭代器。
发布了14 篇原创文章 · 获赞 1 · 访问量 119

猜你喜欢

转载自blog.csdn.net/m0_45867846/article/details/105464474
今日推荐