1、map简介
(1)map的特性
map的所有元素都会根据元素的键值自动排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值,底层机制由红黑树实现。
(2)map的性质
当客户端对它进行元素新增操作或删除操作时,操作之前的所有迭代器,在操作完成之后都依然有效。
2、map的基本操作
使用map时,必须包含
void TestMap2()
{
map<int, string> map2;
map2.insert(map<int, string>::value_type(1, "one"));
map2.insert(map<int, string>::value_type(2, "two"));
map2.insert(map<int, string>::value_type(3, "three"));
map<int, string>::iterator iter = map2.begin();
while (iter != map2.end())
{
cout << iter->first << " " << iter->second << endl;
iter++;
}
}
运行结果为:
2)用数组方式插入数据
void TestMap3()
{
map<int, string> map3;
map3[1] = "one";
map3[2] = "two";
map3[3] = "three";
map<int, string>::iterator iter;
for (iter = map3.begin(); iter != map3.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
}
运行结果为:
3)用insert函数插入pair数据
#include<iostream>
#include<stdlib.h>
#include<map>
#include<string>
using namespace std;
void TestMap1()
{
map<int, string> map1;
map1.insert(pair<int, string>(1, "one"));
map1.insert(pair<int, string>(2, "two"));
map1.insert(pair<int, string>(3, "three"));
map1.insert(pair<int, string>(3, "four"));
map<int, string>::iterator iter;
for (iter = map1.begin(); iter != map1.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
}
int main()
{
TestMap1();
system("pause");
return 0;
}
运行结果为:
用数组插入数据可覆盖原有数据
void TestMap5()
{
map<int, string> map5;
map5[1] = "one";
map5[2] = "two";
map5[3] = "three";
map5[3] = "four";
map<int, string>::iterator iter;
for (iter = map5.begin(); iter != map5.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
}
运行结果为:
如何知道插入成功与否?以下通过pair的第二个参数来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功则第二个参数返回true,否则为false。
void TestMap4()
{
pair<map<int, string>::iterator, bool> insert_bool;
map<int, string> map4;
insert_bool = map4.insert(pair<int, string>(1, "one"));
if (insert_bool.second == true)
{
cout << "insert successfully" << endl;
}
else
{
cout << "insert failure" << endl;
}
insert_bool = map4.insert(pair<int, string>(1, "two"));
if (insert_bool.second == true)
{
cout << "insert successfully" << endl;
}
else
{
cout << "insert failure" << endl;
}
}
运行结果为:
(2)数据的遍历
1)应用前向迭代器,上面的程序中用到。
2)应用反向迭代器。
void TestMap6()
{
map<int, string> map6;
map6.insert(pair<int, string>(1, "one"));
map6.insert(pair<int, string>(2, "two"));
map6.insert(pair<int, string>(3, "three"));
map<int, string>::reverse_iterator iter;
for (iter = map6.rbegin(); iter != map6.rend(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
}
运行结果为:
3)应用数组遍历元素。
void TestMap7()
{
map<int, string> map7;
map7.insert(map<int, string>::value_type(1, "one"));
map7.insert(map<int, string>::value_type(2, "two"));
map7.insert(map<int, string>::value_type(3, "three"));
for (int i = 1; i <= map7.size(); i++)//注意:关键值最小为1而不是0
{
cout << map7[i] << endl;
}
}
运行结果为:
(3)数据的删除
void TestMap8()
{
map<int, string> map8;
map8[1] = "one";
map8[2] = "two";
map8[3] = "three";
map8[4] = "four";
map8[5] = "five";
map8[6] = "six";
map<int, string>::iterator iter;
cout << "原有数据为:" << endl;
for (iter = map8.begin(); iter != map8.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
cout << endl;
//用迭代器删除
iter = map8.find(1);
map8.erase(iter);
cout << "删除关键字1后的数据为:" << endl;
for (iter = map8.begin(); iter != map8.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
cout << endl;
//用关键字删除
int n = map8.erase(1);
cout << "删除关键字1后的数据为:" << endl;
for (iter = map8.begin(); iter != map8.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
cout << endl;
//用迭代器删除区间
map8.erase(map8.begin(), map8.end());
cout << "删除后的数据为:" << endl;
for (iter = map8.begin(); iter != map8.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
}
运行结果为:
注意:使用erase关键字删除数据,如果成功则返回1,否则返回0。
(4)clear():数据的清空。
(5)empty():数据的判空。
(6)size():获取有效元素的大小。
(7)count():获取键值中查找元素的个数。如果有返回1,否则返回0。
(8)rbegin():在反向迭代器中表示起始元素。
(9)rend():在反向迭代器中表示末尾元素。
(10)operator[key]:通过键值(key)获取该key对应的value。
(11)at(key):通过键值(key)获取该key对应的value。
(12)lower_bound(val):返回容器中第一个值【大于或等于】val的元素的iterator位置。
(13)upper_bound(val): 返回容器中第一个值【大于】。
【例】
void TestMap9()
{
map<string, string> map9;
map9.insert(pair<string, string>("鲁智深", "花和尚"));
map9.insert(make_pair("史进", "九纹龙"));
map9.insert(make_pair("公孙胜", "入云龙"));
map9.insert(make_pair("李逵", "黑旋风"));
map9.insert(make_pair("石秀", "拼命三郎"));
map9.insert(make_pair("宋江", "及时雨"));
cout << "map中元素的个数为:" << map9.size() << endl;
cout << "map中的元素有:" << endl;
map<string, string>::iterator iter;
for (iter = map9.begin(); iter != map9.end(); iter++)
{
cout << iter->first << " " << iter->second << endl;
}
cout << endl;
//修改key所对应的value
cout << "修改key所对应的value值" << endl;
cout << "宋江" << "--->" << map9["宋江"] << endl;
map9["宋江"] = "宋大侠";
cout << "宋江" << "--->" << map9["宋江"] << endl << endl;
//通过[]访问不存在的键值对中的value值
cout << "王伦" << "--->" << map9["王伦"] << endl;
cout << "map中的元素的个数为:" << map9.size() << endl;
cout << "插入键值为“王伦”的元素后,元素有:" << endl;
map<string, string>::reverse_iterator re_iter;
for (re_iter = map9.rbegin(); re_iter != map9.rend();re_iter++)
{
cout << re_iter->first << " " << re_iter->second << endl;
}
cout << endl;
//删除
map9.erase(map9.find("王伦"));
cout << "使用erase删除,map中的元素的个数为:" << map9.size() << endl;
//将map中的元素清空
map9.clear();
cout << "将map中的元素清空后,元素的个数为:" << map9.size() << endl;
}
运行结果为: