c++基础 | map

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();  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值