目录
一、map简介
1.map构成
2.map本质
3.map的优点
4.map和multimap区别:map不允许容器中有重复key值元素。multimap允许容器中有重复key值元素。
5.map的构建
6.map的赋值
1️⃣赋值法
2️⃣拷贝赋值法
7.map的成员函数
(1)insert函数
(2)erase函数
(3)清空clear函数
(4)返回容器大小函数
(5)判断map容器是否为空的函数
(6)map的交换swap函数
(7)map的查找函数
8.map的统计count函数
9.map的排序函数
② 利用仿函数可以指定map容器的排序规则。
如果想用sort:
编辑10.lower_bound()函数
multimap 看这个,其实没有特别大的区别 原文链接:https://blog.csdn.net/weixin_45826022/article/details/102892952
一、map简介
1.map构成
map中所有元素都是pair:pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
所有元素都会根据元素的键值自动排序
2.map本质
map、multimap属于关联式容器,底层结构是二叉树实现的。
3.map的优点
可以根据key值快速找到value。
4.map和multimap区别:
map不允许容器中有重复key值元素。
multimap允许容器中有重复key值元素。
5.map的构建
必须要加头文件#include <map>
map<Typedata,Typedata> mp;
6.map的赋值
1️⃣赋值法
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;int main(void){map<int,int> mp;mp[1]=2;mp[3]=4;for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}return 0;
}
2️⃣拷贝赋值法
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;int main(void){cout<<"直接赋值法"<<endl; map<int,int> mp;mp[1]=2;mp[3]=4;for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}cout<<"--------------------"<<endl; cout<<"拷贝赋值法的两个方法"<<endl; map<int,int> m(mp);for(auto i=m.begin();i!=m.end();i++){cout<<i->first<<" "<<i->second<<endl;}cout<<"--------------------"<<endl; map<int,int> p;p=m;for(auto i=p.begin();i!=p.end();i++){cout<<i->first<<" "<<i->second<<endl;}cout<<"--------------------"<<endl; return 0;
}
7.map的成员函数
(1)insert函数
函数原型:insert(elem); //在容器中插入元素。
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;//创建对组并插入map容器的四种方式m1.insert(pair<int, int>(1, 123));m1.insert(make_pair(2, 20));m1.insert(map<int, int>::value_type(3, 30));m1[4] = 40; //可以利用key访问到相对应的valuePrintMap(m1);return 0;
}
运行结果:
(2)erase函数
函数原型:erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(key); //删除容器中值为key的元素。
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;//创建对组并插入map容器的四种方式m1.insert(pair<int, int>(1, 123));m1.insert(pair<int, int>(2, 456));m1.insert(pair<int, int>(3, 789));m1.insert(pair<int, int>(4, 1000));PrintMap(m1);cout<<"第一次删除"<<endl; m1.erase(m1.begin()); //删除m1.begin()迭代器指向的数 PrintMap(m1);cout<<"第二次删除"<<endl; m1.erase(3); //删除key==3的数 PrintMap(m1);cout<<"第三次删除"<<endl; m1.erase(m1.begin(), m1.end()); //删除[m1.begin(),m1.end())区间的值 PrintMap(m1); return 0;
}
运行结果:
(3)清空clear函数
函数原型:clear(); //清除所有元素
(4)返回容器大小函数
函数原型:size(); //返回容器中元素的数目
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;//创建对组并插入map容器的四种方式m1.insert(pair<int, int>(1, 123));m1.insert(pair<int, int>(2, 456));m1.insert(pair<int, int>(3, 789));m1.insert(pair<int, int>(4, 1000));PrintMap(m1);cout<<m1.size()<<endl;return 0;
}
运行结果:
(5)判断map容器是否为空的函数
函数原型:empty(); //判断容器是否为空
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;//创建对组并插入map容器的四种方式m1.insert(pair<int, int>(1, 123));m1.insert(pair<int, int>(2, 456));m1.insert(pair<int, int>(3, 789));m1.insert(pair<int, int>(4, 1000));PrintMap(m1);if(m1.empty()){cout<<"此容器为空"<<endl; }else{cout<<"此容器非空"<<endl;}return 0;
}
(6)map的交换swap函数
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;m1.insert(pair<int, int>(1, 123));m1.insert(pair<int, int>(2, 456));m1.insert(pair<int, int>(3, 789));m1.insert(pair<int, int>(4, 1000));cout<<"交换前的m1的值"<<endl;PrintMap(m1);map<int, int> m2;m2.insert(pair<int, int>(123, 1));m2.insert(pair<int, int>(456, 2));m2.insert(pair<int, int>(789, 3));m2.insert(pair<int, int>(1000, 4));cout<<"交换前的m2的值"<<endl;PrintMap(m2);m1.swap(m2);cout<<"交换后的m1的值"<<endl;PrintMap(m1);cout<<"交换后的m2的值"<<endl; PrintMap(m2);return 0;
}
运行结果:
(7)map的查找函数
函数原型:find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;m1.insert(pair<int, int>(1, 10));m1.insert(pair<int, int>(2, 20));m1.insert(pair<int, int>(2, 10));m1.insert(pair<int, int>(4, 30));m1.insert(pair<int, int>(5, 40));m1.insert(pair<int, int>(6, 50));PrintMap(m1);map<int, int>::iterator pos = m1.find(4);if (pos != m1.end()){//我想表达的是:这两种表达方式相同 pos->first与 (*pos).first cout << "查到了!key = " << pos->first << "\t Value = " << pos->second << endl; cout << "查到了!key = " << (*pos).first << "\t Value = " << (*pos).second << endl;}else{cout << "未找到!" << endl;}return 0;
}
运行结果:
8.map的统计count函数
函数原型:count(key); //统计key的元素个数
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;m1.insert(pair<int, int>(1, 10));m1.insert(pair<int, int>(2, 20));m1.insert(pair<int, int>(2, 10));m1.insert(pair<int, int>(4, 30));m1.insert(pair<int, int>(5, 40));m1.insert(pair<int, int>(6, 50));PrintMap(m1);//对于map容器而言,count()的结果非0即1,因为map容器不允许插入相同key值的对组cout << "一共有 " << m1.count(3) << " 个Key为3的数据" << endl;return 0;
}
运行结果:
9.map的排序函数
① map容器默认排序规则为按照key值进行从小到大排序,利用仿函数,可以改变排序规则。
② 利用仿函数可以指定map容器的排序规则。
③ 对于自定义数据类型,map必须要指定排序规则,同set容器。
class MyCompare
{
public:bool operator()(int v1, int v2){return v1 > v2;}
};
void Map_test05()
{map<int, int> m1;m1.insert(pair<int, int>(4, 40));m1.insert(pair<int, int>(5, 50));m1.insert(pair<int, int>(2, 20));m1.insert(pair<int, int>(1, 10));m1.insert(pair<int, int>(3, 30));PrintMap(m1);map<int, int, MyCompare> m2;m2.insert(pair<int, int>(4, 40));m2.insert(pair<int, int>(5, 50));m2.insert(pair<int, int>(2, 20));m2.insert(pair<int, int>(1, 10));m2.insert(pair<int, int>(3, 30));for (map<int, int, MyCompare>::iterator mit = m2.begin(); mit != m2.end(); mit++){cout << "Key = " << mit->first << " Vaule = " << mit->second << endl;}cout << endl;
}
运行结果:
如果想用sort:
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} bool cmp(pair<int,int> a,pair<int,int> b){if(a.first!=b.first)return a.first>b.first;elsereturn a.second>b.second;
}int main(void){map<int, int> m1;m1.insert(pair<int, int>(1, 10));m1.insert(pair<int, int>(2, 20));m1.insert(pair<int, int>(2, 10));m1.insert(pair<int, int>(4, 30));m1.insert(pair<int, int>(5, 40));m1.insert(pair<int, int>(6, 50));PrintMap(m1);//排序后cout<<"排序后"<<endl; // 将map元素拷贝到vector中 vector<pair<int, int>> vec(m1.begin(), m1.end()); sort(vec.begin(),vec.end(),cmp);for(auto i=vec.begin();i!=vec.end();i++){cout<<i->first<<" "<<i->second<<endl;}return 0;
}
运行结果:
10.lower_bound()函数
lower_bound()
函数返回一个迭代器,指向 std::map
中第一个键值大于或等于给定元素的位置。如果没有找到,返回指向 map
末尾的迭代器。
实例:
#include <iostream>
#include <map> int main() { std::map<int, std::string> myMap; myMap.insert({1, "One"}); myMap.insert({2, "Two"}); myMap.insert({3, "Three"}); myMap.insert({5, "Five"}); myMap.insert({7, "Seven"}); // 使用 lower_bound 查找 int keyToFind = 4; // 查找 >= 4 的第一个键 auto it = myMap.lower_bound(keyToFind); // 输出结果 if (it != myMap.end()) { std::cout << "The first key >= " << keyToFind << " is: " << it->first << ", Value: " << it->second << "\n"; } else { std::cout << "No key >= " << keyToFind << " found in the map.\n"; } return 0;
}
运行结果:
multimap 看这个,其实没有特别大的区别
原文链接:https://blog.csdn.net/weixin_45826022/article/details/102892952