map内部自建一棵红黑树,自动建立Key-Value的一一对应关系。
在map中增加和删除节点对迭代器的影响很小:除了操作节点,对其他的节点都没有什么影响。
根据Key值快速查找记录,查找的复杂度基本是Log(N)。
1. map的插入
map的插入有三种方式:1. 用insert函数插入pair数据;2. 用insert函数插入value_type数据;3. 用数组方式插入数据。
- 用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");
- 用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"));
- 用数组方式插入数据:
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. 数组方式。
-
前向迭代器不复习了,直接看后两种:
-
反向迭代器遍历:
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()方法指出反向遍历的起始位置和终止位置。
- 数组遍历:
int iSize = mapStudent.size();
for(int i=1; i<=iSize; i++)
{
cout<<i<<" "<<mapStudent[i]<<endl;
}
3. map的查找
map的查找有两种方式:
- 用count函数判断关键字是否出现,其缺点是无法定位数据出现位置。由于map是一对一映射,count函数的返回值要么是0,要么是1。
int number = mapStudent.count(1);
- 用find函数定位数据出现的位置,它返回一个迭代器:当数据出现时,它返回数据所在位置的迭代器;当map中没有要查找的数据,它返回超尾的end迭代器。
map<int, string>::iterator iter = mapStudent.find(1);
4. map的删除
对于map<int, string> mapStudent;
,用erase方法删除元素:
mapStudnet.erase(int k);
删除map中键为k的元素,并返回size_type类型的值以表示删除的元素个数。mapStudent.erase(map<int, string>::iterator p);
从map中删除迭代器p所指向的元素,返回void类型。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;
}
由于返回void,不同于vector中erase返回删除的下一位置,所以代码中也有区别,详见 线性容器vector的使用—>“3. vector的删除”。 ↩︎