目录
4.map和multimap区别:map不允许容器中有重复key值元素。multimap允许容器中有重复key值元素。
multimap 看这个,其实没有特别大的区别 原文链接:https://blog.youkuaiyun.com/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访问到相对应的value
PrintMap(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;
else
return 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.youkuaiyun.com/weixin_45826022/article/details/102892952