关联容器map的使用

6 篇文章 0 订阅

map内部自建一棵红黑树,自动建立Key-Value的一一对应关系。
在map中增加和删除节点对迭代器的影响很小:除了操作节点,对其他的节点都没有什么影响。
根据Key值快速查找记录,查找的复杂度基本是Log(N)。

1. map的插入

map的插入有三种方式:1. 用insert函数插入pair数据;2. 用insert函数插入value_type数据;3. 用数组方式插入数据。

  1. 用insert函数插入pair数据:
map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(1, "student_one"));
mapStudent.insert(pair<int, string>(2, "student_two"));
mapStudent.insert(pair<int, string>(3, "student_three");
  1. 用insert函数插入value_type数据:
map<int, string> mapStudent;
mapStudent.insert(map<int, string>::value_type (1, "student_one"));
mapStudent.insert(map<int. string>::value_type (2, "student_two"));
mapStudent.insert(map<int, string>::value_type (3, "student_three"));
  1. 用数组方式插入数据:
map<int, string> mapStudent;
mapStudent[1] = "student_one";
mapStudent[2] = "student_two";
mapStudent[3] = "student_three";
  • insert与数组插入方式的区别
    map中关键字不重复,用insert插入数据时,当map中已有这个关键字,insert操作时插入不了数据的,但用数组方式则会覆盖以前该关键字对应的值。
2. map的遍历

map的遍历也有三种方式:1. 应用前向迭代器方式;2. 应用反向迭代器;3. 数组方式。

  1. 前向迭代器不复习了,直接看后两种:

  2. 反向迭代器遍历:

map<int, string>::reverse_iterator iter;
for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)
{
	cout<<iter->first<<" "<<iter->second<<endl;
}

iter就是一个反向迭代器reverse_iterator,它需要使用rbegin()和rend()方法指出反向遍历的起始位置和终止位置。

  1. 数组遍历:
int iSize = mapStudent.size();
for(int i=1; i<=iSize; i++)
{
	cout<<i<<" "<<mapStudent[i]<<endl;
}
3. map的查找

map的查找有两种方式:

  1. 用count函数判断关键字是否出现,其缺点是无法定位数据出现位置。由于map是一对一映射,count函数的返回值要么是0,要么是1。
    int number = mapStudent.count(1);
  2. 用find函数定位数据出现的位置,它返回一个迭代器:当数据出现时,它返回数据所在位置的迭代器;当map中没有要查找的数据,它返回超尾的end迭代器。
    map<int, string>::iterator iter = mapStudent.find(1);
4. map的删除

对于map<int, string> mapStudent;,用erase方法删除元素:

  1. mapStudnet.erase(int k);删除map中键为k的元素,并返回size_type类型的值以表示删除的元素个数。
  2. mapStudent.erase(map<int, string>::iterator p);从map中删除迭代器p所指向的元素,返回void类型。
  3. mapStudent.erase(map<int, string>::iterator beg, map<int, string>::iterator en);从map中删除一段范围内的元素,返回void类型。
  • 常用的是第二种,并在是在遍历过程中删除元素1
map<int, string> mapStudent;
mapStudent.insert(map<int, string>::value_type (1, "student_one"));
mapStudent.insert(map<int. string>::value_type (2, "student_two"));
mapStudent.insert(map<int, string>::value_type (3, "student_three"));
map<int, string>::iterator iter = mapStudnet.begin();
for( ; iter!=mapStudnet.end(); )
{
	if((*iter).second == "studnet_one")
		mapStudnet.erase(iter++);
	else
		++iter;
}

  1. 由于返回void,不同于vector中erase返回删除的下一位置,所以代码中也有区别,详见 线性容器vector的使用—>“3. vector的删除”。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值