自学STL之map
简介:
- map中所有元素都是pair
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
本质:
- map/multimap属于关联式容器,底层结构是用二叉树实现。
优点:
- 可以根据key值快速找到value值
函数原型:
insert(elem);
//在容器中插入元素。clear();
//清除所有元素erase(pos);
//删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end);
//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(key);
//删除容器中值为key的元素。size();
//返回容器中元素的数目empty();
//判断容器是否为空swap(st);
//交换两个集合容器find(key);
//查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();count(key);
//统计key的元素个数
代码实现:
插入和删除:
#include<iostream>
#include<map>
using namespace std;
void printMap(map<int,int>&m){
for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
cout<<"key = "<<it->first<<" value = "<<(*it).second<<endl;
}
cout<<endl;
}
void test01(){
map<int,int> m;
//插入
//第一种插入方式
m.insert(pair<int,int>(1,10));
//第二种插入方式
m.insert(make_pair(2,20)); //这个比较常用
//第三种插入方式(认识就行)
m.insert(map<int,int>::value_type(3,30));
//第四钟(一般不用来插入,一般用于通过key找value)
m[4]=40;
printMap(m);
//删除
m.erase(m.begin());
printMap(m);
m.erase(3);//把key值为3的元素删除,也就是把30删除了,这个是按key值查找的
printMap(m);
// m.erase(m.begin(),m.end());
m.clear();
printMap(m);
}
int main(){
test01();
return 0;
}
查找和统计:
#include<iostream>
#include<map>
using namespace std;
void test01(){
map<int,int> m;
m.insert(make_pair(1,10));
m.insert(make_pair(2,20));
m.insert(make_pair(3,30));
//查找
map<int,int>::iterator pos = m.find(3);
if(pos!=m.end()){
cout<<"找到了 key = "<<pos->first<<" value = "<<pos->second<<endl;
}else{
cout<<"未找到"<<endl;
}
//统计 因为map不允许有重复的key值,所以每一个key值对应的value要么有(1)要么没有(0)
int num = m.count(1);
cout<<num<<endl;
int num1 = m.count(4);
cout<<num1<<endl;
}
int main(){
test01();
return 0;
}
总结:
1、利用仿函数可以指定map容器的排序规则
2、对于自定义数据类型,map必须要指定排序规则,同set容器
3、还是得多用题目练习这些容器,继续加油!!!