C++中Map的常见用法

最近工作中,对map的使用比较频繁,所以对常见的map相关用法做一下整理

介绍

map是STL(中文标准模板库)的一个关联容器。 可以将任何基本类型映射到任何基本类型。

  1. map提供一对一的数据处理,key-value键值对,其类型可以自己定义,第一个称为关键字,第二个为关键字的值
  2. map内部是根据key自动排序的

声明

//第一个是键的类型(key),第二个是值的类型(value)
map<type1name,type2name> maps;

#include <map>
using namespace std;

int main() {
//way1
 map<int, string> map1 = {
 			{ 9,"a1" }, 
 			{ 7, "a2" }, 
 			{ 8,"a3" }
 			};
 //way2
 map<int,string> map1;
 mapStudent[9] =  "a1";
 mapStudent[7] =  "a2";
 mapStudent[8] =  "a3";
 
 return 0;
 }

插入

// 定义一个map对象
map<int, string> map1;

//用insert函数插入pair
map1.insert(pair<int, string>(123, "kk"));
 
// 用insert函数插入value_type数据
map1.insert(map<int, string>::value_type(123, "kk"));
 
//用insert函数插入make_pair
map1.insert(make_pair(123, "kk"));
 
// 用数组方式插入
map1[123] = "kk";

删除

//删除键为123指向的元素
map1.erase(123);
 
//删除迭代器 key所指向的元素
map<int,string>::iterator key = map1.find(123);
  if(key!=map1.end())
 {
	map1.erase(key);
 }
 
//删除所有元素
map1.erase(map1.begin(),map1.end());

遍历

//way1:迭代器
map<int,int> m;
map<int,int>::iterator iter;
iter = m.begin();
while(iter != m.end()){
	//cout << (*iter).first << "-" << (*iter).second << endl;
	cout << iter->first << "-" << iter->second << endl;
	iter++;
}

for (iter = m.begin();iter != m.end(); iter++){
	cout << iter->first << "-" << iter->second << endl;
}
//way2 :自动遍历
for(auto &it : m){
	cout << it.first << "-" << it.second <<endl;
}
//way3 :数组遍历,key不是int形式,或key不是连续数值都会出现问题
//不建议使用
for (auto i = 0; i < m.size(); i++){
	m[i] = i*i;
}

逆序遍历

maps.rbegin()返回指向map尾部的逆向迭代器
maps.rend()返回指向map头部的逆向迭代器

//反向迭代
map<string,int>::reverse_iterator it;
for(it = maps.rbegin(); it != maps.rend(); it++)
    cout<<it->first<<' '<<it->second<<endl;

其他常见用法

获取第一个或最后一个位置的值

map<int, string> map1 = {
 			{ 9, "a1"}, 
 			{ 7, "a2"}, 
 			{ 6, "a4"},
 			{ 8, "a3"}, 
 			{ 5, "a6"},
 			{ 8, "a4"}
 			};
 //map会自动排序去重,则会得到
 /* 5 - a6
    6 - a4
    7 - a2
    8 - a3
    9 - a1
 */	
 //map的第一个key对应的value
string firstVal= map1.begin()->second;  //a6
//map的最后一个key对应的value
string lastVal = map.rbegin()->second;  //a1

同时获取map中的当前值和下一个值

map<int,string>::iterator iter, iterNext, iterE;
iterE = prev(map1.end(), 1); //倒数第一个位置的迭代器
for(iter = map1.begin(); iter != iterE; iter++)
{
	iterNext = next(iter, 1); //下一个位置的迭代器
	string curVal = (*iter).second;
	string nextVal = (*iterNext).second;
}

int disIToE = distance(it, map.end(1)) ; //迭代器当前位置距离末端的距离,最小为1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值