详解map与multimap容器

目录

一、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.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

### 关于 `multimap` 数据结构的介绍用法 #### 定义特性 `multimap` 是一种关联容器,允许存在多个具有相同键值的元素。这使得它非常适合用于表示一对多的关系,在 C++ 中由标准模板库(STL)提供支持[^2]。 #### 创建初始化 可以通过多种方式来创建并初始化一个多映射表: - 使用默认构造函数创建空对象; - 利用列表初始化器语法一次性填充初始数据集; ```cpp #include <iostream> #include <map> int main(){ // 默认构造函数创建 std::multimap<int, char> mm; // 初始化时赋初值 std::multimap<std::string,std::string> myMultimap = { {"Fruits","Banana"},{"Fruits","Apple"}, {"Vegetables","Carrot"} }; } ``` #### 插入新条目 向 `multimap` 添加新的键值对非常简单,可以直接通过成员函数 `insert()` 或者使用下标运算符完成此操作。需要注意的是由于可能存在重复键的情况因此建议优先采用 `insert()` 方法以确保不会意外覆盖已有记录[^3]。 ```cpp // 正确做法:调用 insert 函数显式插入 myMultimap.insert(std::make_pair("Fruits", "Pear")); // 不推荐的做法:可能引起歧义 myMultimap["Fruits"]="Grape"; ``` #### 访问已存项目 遍历整个集合或者查找指定条件下的子集都可以借助迭代器实现。对于给定的关键字还可以利用成员方法 `equal_range()` 来获取所有匹配项组成的范围[^4]。 ```cpp auto range=myMultimap.equal_range("Fruits"); for(auto it=range.first;it!=range.second;++it){ std::cout<<(*it).second<<"\n"; } // 输出结果可能是: // Banana // Apple // Pear ``` #### 删除现有节点 当不再需要某些特定键所对应的所有实例时可运用 erase() 成员函数移除它们。如果只想删除单个实体则需先定位到具体位置再执行清除动作[^5]。 ```cpp size_t numErased=myMultimap.erase("Meat"); // 移除 Meat 类别及其全部商品 if(numErased==0)puts("No such category found."); else printf("%zu items removed.\n",numErased); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值