文章目录
- 定义及初始化
- 一些基本操作
- 插入
- 查找
- 删除
- 遍历
定义及初始化
#include <map>map<string, int> m1;
m1['first']=7;map<string,int> m2 = {{"first",1}, {"sec",2}, {"trd",3}
};map<string, int> m3;
m3.insert({ "abc", 1 }); //最常用,使用这种就可以了
m3.insert(make_pair(string("def"), 2));
m3.insert(pair<string, int>(string("ghi"), 3));
一些基本操作
begin() //返回指向map头部的迭代器
clear() //删除所有元素
count() //返回指定元素出现的次数
empty() //如果map为空则返回true
end() //返回指向map末尾的迭代器
equal_range() //返回特殊条目的迭代器对
erase() //删除一个元素
find() //查找一个元素
get_allocator() //返回map的配置器
insert() //插入元素
key_comp() //返回比较元素key的函数
lower_bound() //返回键值>=给定元素的第一个位置
max_size() //回可以容纳的最大元素个数
rbegin() //返回一个指向map尾部的逆向迭代器
rend() //返回一个指向map头部的逆向迭代器
size() //返回map中元素的个数
swap() //交换两个map
upper_bound() //返回键值>给定元素的第一个位置
value_comp() //返回比较元素value的函数
插入
用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是无法插入数据的,但是用数组方式插入相同键的键值对时,后一组的键值对会覆盖前一组键值对。
map<int,string> m;
//方法一
m.insert(pair<int ,string>(1,"stu1"));
//方法二
m[2] = "stu2";
//方法三
m.insert(make_pair(3,"teacher03"));//无需写出型别,就可以生成一个pair对象,更方便
//方法四
m.insert(map<int,string>::value_type(5,"stu5"));
m.insert({5,"stu5"});
还可以参考:https://blog.csdn.net/tjcwt2011/article/details/136475689
查找
if(m.find(1) != m.end())cout << "FOUND" << endl;
elsecout << "NOTFOUND" << endl; for(auto iter = m.begin(); iter != m.end();)
{if (iter->first == 4){cout<<"FOUND";}else++iter;
}
删除
//方法一
m.erase(2);
//方法二
auto it = m.find(3);
m.erase(it);//像这种删除单个节点,map的行为不会出现问题,但是当在一个循环里用的时候,往往会被误用。//错误用法:
for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter)
{ cout<<iter->first<<":"<<iter->second<<endl; mapTest.erase(iter);
} //这是一种错误的写法,会导致程序行为不可知,原因是map是关联容器,对于关联容器来说,如果一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用,负责会导致程序无定义的行为。//正确用法一
std::map<std::string, std::string >::iterator it = mapTest.begin();
while(it != mapTest.end())
{ if(TestVal(it->second)) { it = mapTest.erase(it); } else it++;
} //正确用法二
for(ITER iter=mapTest.begin();iter!=mapTest.end();) //注意此处不能再写iter++
{ cout<<iter->first<<":"<<iter->second<<endl; mapTest.erase(iter++);
}
//在这种用法中,该方法中利用了后++的特点,这个时候执行mapTest.erase(it++);这条语句分为三个过程
//1、先把it的值赋值给一个临时变量做为传递给erase的参数变量
//2、因为参数处理优先于函数调用,所以接下来执行了it++操作,也就是it现在已经指向了下一个地址。
//3、再调用erase函数,释放掉第一步中保存的要删除的it的值的临时变量所指的位置。
Reference:https://www.cnblogs.com/pannyvan/p/6233400.html
遍历
//使用迭代器遍历
for(auto it = m.begin(); it != m.end(); it++ )
{cout << it->first <<" " << it->second << endl;
} //c++11之后
for(auto it : m){cout << it.first <<" "<< it.second <<endl;
}
Reference:
https://blog.csdn.net/qq_48508278/article/details/118531197