1.map 中元素有序无重复 2.map是关联容器 关联容器与顺序容器的区别 (1)关联容器:元素是按照关键字来保存和访问 (2)顺序容器:元素是按照在容器中的位置保存和访问 3.map在底层通常用二叉搜索树实现 4.map的本质是映射,键值对一一对应
一.map的初始化 1.默认构造
map<key,value> mp;
映射前的类型键key,映射后的类型值value (1)整型到整型的映射
map<int,int> mp;
(2)字符串到整型的映射,必须使用string而不能使用char.若是字符可以用char
map<string,int> mp;
(3)key和value也可以是STL容器,eg:将一个vector容器映射到一个字符串;
map<vector,string> mp;
2.范围构造
map<key, value> m(iterator first, iterator last);
将迭代器[frist, last)范围内的元素填入map中
3.拷贝构造
map<key, value> m(cosnt map& m);
用m构造map
二.访问 1.以键访问值
map<char,int> mp; mp[‘c’]=520; mp[‘c’]=521; //520会被覆盖
2.以迭代器访问
map<key,value>::iterator it;
it->first访问键,it->second访问值
map<char,int> mp; mp[‘a’]=10; mp[‘b’]=20; mp[‘c’]=30; map<char,int>::iterator it; for(it=mp.begin();it!=mp.end();it++) { cout<< it->first<<" "<< it->second; }
3.反向迭代器
map<char,int> ::reverse_iterator Itr; Itr = mp.rbegin(); While(Itr != mp.rend()) { Itr++; }
三.查找 1.find(key)
返回一个迭代器: 若key存在,则返回key所在位置的迭代器 若key不存在,则返回mp.end()
#include < map> #include < iostream> using namespace std; int main(){ map<int,int> grade; grade[1] = 100; grade[2] =99; grade[3] = 98; map<int, int>::iterator it=grade.find(1); if(it!= grade.end()){ cout<<"Found, the value is "<< it->second<<endl; } return 0; }
2.count函数 用来判断关键字是否出现,但无法定位数据出现的位置。返回值0或1,当要判断的key出现,返回1
四.插入 1.mp[key]=value;
mp[‘a’]=10;
可以覆盖以前该关键字对应的值
2.insert函数
mp.insert(pair<int , string>(22 ,“zhang zan”)); mp.insert(make_pair<int , string>(22 ,“zhang zan”));
(1)Insert不能覆盖,如果键已经存在,则插入失败 (2)make_pair函数,由传递给它的两个实参生成一个新的pair对象,所以如果键已经存在,则会更新键对应的值。
用pair来获得insert执行后是否插入成功
map<int, string> mapStudent; pair<map<int, string>::iterator, bool> Insert_Pair; Insert_Pair = mapStudent.insert(pair<int, string>(1, “student_one”)); If(Insert_Pair.second == true) { cout<<” Successfully”<<endl; } else { cout<<” Failure”<<endl; }
五.删除 1.移除迭代器it所指向的元素
erase(it);
map<int, int>::iterator it=grade.begin(); for(it;it!=grade.end();it++) { if((*it).second==99) { grade.erase(it); } }
2.移除迭代器范围为[0,5)的元素序列
erase(it,it+5);
3.移除key和对应value,然后返回所移除元素的个数。 只能返回0或1,若返回0,则表明元素不在容器中;
六.判断两个map中键值是否相等 1.已知两个map中键相等,如何判断其值是否相等
bool judge(map<string,int> &left,map<string,int> &right) { map<string,int>::iterator it; for(it=left.begin();it!=left.end();it++) { if(right[it->first]!=it->second) { return false; } } return true; }
七.其他 mp.size() 返回元素数目 mp.empty() 判断是否为空 mp.clear() 清空所有元素
