map 是标准的【关联式容器】,一个 map 是一个键值对序列,即 (key,value) 对。它提供基于 key 的快速检索能力。
map 中 key 值是唯一的 。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
map 的具体实现采用红黑树变体的平衡二叉树的数据结构 。在插入操作和删除操作上比 vector 快。
map 可以直接存取 key 所对应的 value ,支持 [] 操作符,如 map[key]=value 。
map 与 multimap 的区别: map 支持唯一键值,每个键只能出现一次;而 multimap 中相同键可以出现多次。 multimap 不支持 [] 操作符
map的构造
map<int,int> mInt;
map的插入
1. 插入方式
map<int,string> m1;
//-- 方法1:
m1.insert(pair<int, string>(1, "s1"));
m1.insert(pair<int, string>(2, "s2"));
//--方法2:
m1.insert(make_pair(3, "s3"));
m1.insert(make_pair(4, "s4"));
//--方法3:
m1.insert(map<int, string>::value_type(5, "s5"));
m1.insert(map<int, string>::value_type(6, "s6"));
//--方法4:
m1[7] = "s7";
m1[8] = "s8";
for (map<int, string>::iterator it = m1.begin(); it != m1.end(); it++)
{
cout << it->first << "\t" << it->second << endl;
}
cout << "==========删除==========\n";
while (!m1.empty())
{
map<int, string>::iterator it = m1.begin();
cout << it->first << "\t" << it->second << endl;
m1.erase(it);
}
2. 插入方式对比
map<int, string> m1;
//-- 方法1:
m1.insert(pair<int, string>(1, "s1"));
pair<map<int, string>::iterator, bool> mypair1 = m1.insert(pair<int, string>(2, "s2"));
if (mypair1.second)
{
cout << "插入成功!!\n";
cout << mypair1.first->first << "\t" << mypair1.first->second << endl;;
}
else
cout << "插入失败!!\n";
//--方法2:
m1.insert(make_pair(3, "s3"));
m1.insert(make_pair(4, "s4"));
//--方法3:
m1.insert(map<int, string>::value_type(5, "s5"));
m1.insert(map<int, string>::value_type(6, "s6"));
pair<map<int, string>::iterator, bool> mypair2 = m1.insert(map<int, string>::value_type(6, "s6"));
if (mypair2.second)
{
cout << "插入成功!!\n";
cout << mypair2.first->first << "\t" << mypair2.first->second << endl;;
}
else
cout << "插入失败!!\n";
//--方法4:
m1[7] = "s7";
m1[8] = "s8";
m1[8] = "s88";
for (map<int, string>::iterator it = m1.begin(); it != m1.end(); it++)
{
cout << it->first << "\t" << it->second << endl;
}
/*
@结论:
1. 方法1、2、3的返回值是 pair<iterator, bool> 类型
2.方法1,2,3 插入相同的元素时插入失败 方法4覆盖
*/
map查找
/*
//查找键 key 是否存在,若存在,返回该键的元素的迭代器;若不存在,返回 map.end();
map.find(key);
//返回容器中 key 为 keyElem 的对组个数。对 map 来说,要么是 0 ,要么是 1 。对 multimap 来说,值可能大于 1
map.count(keyElem);
// 返回第一个 key>=keyElem 元素的迭代器。
map.lower_bound(keyElem);
// 返回第一个 key>keyElem 元素的迭代器。
map.upper_bound(keyElem);
// 返回容器中 key 与 keyElem 相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如 [beg,end) 。
以上函数返回两个迭代器,而这两个迭代器被封装在 pair 中。
map.equal_range(keyElem);
*/
map<int, string> m1;
//-- 方法1:
m1.insert(pair<int, string>(1, "s1"));
m1.insert(pair<int, string>(2, "s2"));
//--方法2:
m1.insert(make_pair(3, "s3"));
m1.insert(make_pair(4, "s4"));
//--方法3:
m1.insert(map<int, string>::value_type(5, "s5"));
m1.insert(map<int, string>::value_type(6, "s6"));
//--方法4:
m1[7] = "s7";
m1[8] = "s8";
map<int, string>::iterator tmpm =m1.find(5);
if (tmpm == m1.end())
{
cout << "查找失败..." << endl;
}else{
cout << tmpm->first << "\t" << tmpm->second << endl;
}
pair<map<int, string>::iterator, map<int, string>::iterator> tmppair = m1.equal_range(5);
if (tmppair.first == m1.end())
{
cout << "查找失败..." << endl;
}else{
cout << tmppair.first->first << "\t" << tmppair.first->second << endl;
cout << tmppair.second->first << "\t" << tmppair.second->second << endl;
}
map拷贝构造与赋值
/*
map(const map &mp); // 拷贝构造函数
map& operator=(const map &mp); // 重载等号操作符
map.swap(mp); // 交换两个集合容器
*/
map<int, string> mapA;
mapA.insert(pair<int, string>(3, " 小张 "));
mapA.insert(pair<int, string>(1, " 小杨 "));
mapA.insert(pair<int, string>(7, " 小赵 "));
mapA.insert(pair<int, string>(5, " 小王 "));
cout << "交换之前的mapA:" << endl;
for (map<int, string>::iterator it = mapA.begin(); it != mapA.end(); it++)
{
cout << it->first << "\t" << it->second << endl;
}
cout << endl;
//-- 拷贝构造
map<int, string> mapB(mapA);
//-- 赋值
map<int, string> mapC;
mapC = mapA;
//-- 交换mapC 和mapA
mapC[3] = " 老张 ";
mapC[1] = " 老杨 ";
mapC[7] = " 老赵 ";
mapC[5] = " 老王 ";
mapC.swap(mapA);
cout << "交换之后的mapA:" << endl;
for (map<int, string>::iterator it = mapA.begin(); it != mapA.end(); it++)
{
cout << it->first << "\t" << it->second << endl;
}
cout << endl;
cout << "交换之前的mapC:" << endl;
for (map<int, string>::iterator it = mapC.begin(); it != mapC.end(); it++)
{
cout<< it->first << "\t" << it->second << endl;
}
map的大小
map.size(); // 返回容器中元素的数目
map.empty(); // 判断容器是否为空
map的删除
/*
map.erase(beg,end); // 删除区间 [beg,end) 的所有元素 ,返回下一个元素的迭代器。
map.erase(pos); // 删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
map.erase(keyElem); // 删除容器中 key 为 keyElem 的对组。
map.clear(); // 删除所有元素
*/
map<int, string> mapA;
mapA.insert(pair<int, string>(3, " 小张 "));
mapA.insert(pair<int, string>(1, " 小杨 "));
mapA.insert(pair<int, string>(7, " 小赵 "));
mapA.insert(pair<int, string>(5, " 小王 "));
//-- 删除区间内的元素
map<int, string>::iterator itBegin = mapA.begin();
++itBegin;
++itBegin;
map<int, string>::iterator itEnd = mapA.end();
mapA.erase(itBegin, itEnd);
/* 此时容器 mapA 包含按顺序的 {1," 小杨 "}{3," 小张 "} 两个元素*/
mapA.insert(pair<int, string>(7, " 小赵 "));
mapA.insert(pair<int, string>(5, " 小王 "));
//-- 删除容器中第一个元素
mapA.erase(mapA.begin());
/* 此时容器 mapA 包含了按顺序的 {3," 小张 "}{5," 小王 "}{7," 小赵 "} 三个元素*/
//-- 删除容器中 key 为 5 的元素
mapA.erase(5);
//-- 删除 mapA 的所有元素
mapA.clear();