• 【STL】map/multimap容器


    1. map容器基本概念

    特点:

    • map中的所有元素都是pair(对组)
    • pair对组中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
    • 所有元素都会根据元素的键值自动排序
    • 可以根据key值快速找到value值

    本质:

    • map/multimap属于关联式容器,底层结构使用二叉树实现的

    map和multimap的区别:

    1. map容器不允许有重复key值的元素
    2. multimap容器允许有重复key值的元素

    map容器构造和赋值

    功能描述:

    • 对map容器进行构造和赋值操作

    函数原型:

    map<T1, T2> mp; //map默认构造函数:
    map(const map &mp); //拷贝构造函数
    
    map& operator=(const map &mp); //重载等号操作符
    
    • 1
    • 2
    • 3
    • 4

    示例:

    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(pair<int, int>(2, 20));
    	m.insert(pair<int, int>(3, 30));
    	m.insert(pair<int, int>(4, 40));
    	printMap(m);
    
    	map<int, int> m2(m);//拷贝构造
    	printMap(m2);
    
    	map<int, int> m3;
    	m3 = m2;//赋值
    	printMap(m3);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3. map容器大小和交换

    功能描述:

    • 统计map容器大小以及交换map容器

    函数原型:

    size(); //返回容器中元素的数目
    empty(); //判断容器是否为空
    swap(st); //交换两个集合容器
    
    • 1
    • 2
    • 3

    示例:

    void test01()
    {
    	map<int, int> m;
    	m.insert(pair<int, int>(1, 10));
    	m.insert(pair<int, int>(2, 20));
    	m.insert(pair<int, int>(3, 30));
    
    	if (m.empty())
    	{
    		cout << "m为空" << endl;
    	}
    	else
    	{
    		cout << "m不为空" << endl;
    		cout << "m的大小为: " << m.size() << endl;
    	}
    
    	map<int, int> m1;
    	m1.insert(pair<int, int>(10, 10));
    	m1.insert(pair<int, int>(20, 20));
    	m1.insert(pair<int, int>(30, 30));
    	m.swap(m1);
    
    	printMap(m);
    	printMap(m1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    总结:

    1. 统计大小——size()
    2. 判断是否为空——empty()
    3. 交换容器——swap()

    4. map容器插入和删除

    功能描述:

    • 对map容器进行插入和删除数据

    函数原型:

    insert(elem); //在容器中插入元素。
    clear(); //清除所有元素
    erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
    erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
    erase(key); //删除容器中值为key的元素。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    示例:

    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));
    	//第四种  不推荐
    	m[4] = 40;
    	printMap(m);
    
    	//删除
    	m.erase(m.begin());
    	printMap(m);
    
    	m.erase(3);
    	printMap(m);
    
    	//清空
    	//m.clear();
    	m.erase(m.begin(), m.end());
    	printMap(m);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    5. map容器查找和统计

    功能描述:

    • 对map容器进行查找数据以及统计数据

    函数原型:

    find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
    count(key); //统计key的元素个数
    
    • 1
    • 2

    示例:

    void test01()
    {
    	map<int, int> m;
    	m.insert(pair<int, int>(1, 10));
    	m.insert(pair<int, int>(2, 20));
    	m.insert(pair<int, int>(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;
    	}
    	//统计
    	int num = m.count(3);
    	cout << "num = " << num << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    总结:

    1. 查找——find()(返回的是迭代器)
    2. 统计——count()(对于map,是0或1)

    6. map容器排序

    map容器默认排序规则为 按照key值进行 从小到大排序,掌握如何改变排序规则

    主要技术点:

    • 利用仿函数,可以改变排序规则

    示例:

    class MyCompare
    {
    public:
    	bool operator()(int v1, int v2)const
    	{
    		return v1 > v2;
    	}
    };
    
    void test01()
    {
    	map<int, int, MyCompare> m;
    	m.insert(make_pair(1, 10));
    	m.insert(make_pair(2, 20));
    	m.insert(make_pair(3, 30));
    	m.insert(make_pair(4, 40));
    
    	for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); ++it)
    	{
    		cout << "key: " << it->first << " value: " << it->second << endl;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    注意:记得在仿函数后面加const,不然会报错

  • 相关阅读:
    AIGC领航,智能AI赋能乡村教育,梦想扬帆远航
    分布式系统原理-CAP定理,说起来一句话,实际坑不少
    AI大模型-启航
    微信小程序中如何使用fontawesome6的免费图标
    基于FPGA的AHT10传感器温湿度读取
    Electron 调试node_internal代码*
    Android 内容提供者和内容观察者:数据共享和实时更新的完美组合
    Asp-Net-Core开发笔记:集成Hangfire实现异步任务队列和定时任务
    美颜SDK集成指南:为应用添加视频美颜功能
    C语言实现根据用户输入的整数求和(两种方法)
  • 原文地址:https://blog.csdn.net/qq_59702185/article/details/126680279