最近工作中,对map的使用比较频繁,所以对常见的map相关用法做一下整理
介绍
map是STL(中文标准模板库)的一个关联容器。 可以将任何基本类型映射到任何基本类型。
- map提供一对一的数据处理,key-value键值对,其类型可以自己定义,第一个称为关键字,第二个为关键字的值
- 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