• Map和Multimap容器(C++)


    3.9 map/ multimap 容器

    3.9.1 map基本概念

    简介:

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

    本质:

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

    优点:

    • 可以根据key 值快速找到value 值

    map 和multimap 区别:

    • map不允许容器中有重复key 值元素
    • multimap 允许容器中有重复key 值元素

    3.9.2 map 构造和赋值

    函数原型:

    • map<T1, T2> mp; //map默认构造函数
    • map(const map& mp); //拷贝构造函数

    赋值:

    • map& operator=(const map& mp); //重载等号操作符

    示例:

    #include<iostream>
    #include<string>
    #include<map>
    using namespace std;
    
    //打印
    void PrintMap(const map<int, int>& mp) {
    	for (map<int, int>::const_iterator it = mp.begin(); it != mp.end(); it++) {
    		cout << "key = " << (*it).first << " value = " << (*it).second << endl;
    	}
    }
    
    //map构造和赋值
    void test01() {
    	map<int, int> mp;
    	mp.insert(pair<int, int>(1, 10));
    	mp.insert(pair<int, int>(3, 30));
    	mp.insert(pair<int, int>(4, 40));
    	mp.insert(pair<int, int>(2, 20));
    	PrintMap(mp);
    	cout << endl;
    	//拷贝构造
    	map<int, int> mp2(mp);
    	PrintMap(mp2);
    	cout << endl;
    	//赋值
    	map<int, int> mp3;
    	mp3 = mp2;
    	PrintMap(mp3);
    }
    
    
    //主函数
    int main() {
    	test01();
    	system("pause");
    	return 0;
    }
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    总结:map 中所有元素都是成对出现,插入数据时候要使用对组

    3.9.3 map 大小和交换

    功能描述:

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

    函数原型:

    • size(); //返回容器中元素的数目
    • empty(); //判断容器是否为空
    • swap(mp); //交换两个map容器

    3.9.4 map 插入和删除

    函数原型:

    • insert(elem); //在容器中插入元素
    • clear(); //清除所有元素
    • erase(pos); //删除pos 迭代器所指的元素,返回下一个元素的迭代器
    • erase(beg, end); //删除区间[beg, end]的所有元素,返回下一个元素的迭代器
    • erase(key); //删除容器中值为key 的元素
    #include<iostream>
    #include<map>
    using namespace std;
    
    //打印
    void PrintMap(const map<int, int>& m) {
    	for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
    		cout << "key = " << (*it).first << " value = " << (*it).second << endl;
    	}
    }
    
    //map插入和删除
    void test01() {
    	map<int, int>m;
    
    	//插入
    	//第一种
    	m.insert(pair<int, int>(1, 10));
    	//第二种
    	m.insert(make_pair(3, 30));
    	//第三种
    	m.insert(map<int, int>::value_type(2, 20));
    	//第四种
    	m[0] = 0;
    	//[]不建议插入,用途 可以利用key访问value
    	cout << m[5] << endl;
    
    	PrintMap(m);
    	cout << endl;
    
    	//删除
    	//第一种
    	m.erase(m.begin());
    	PrintMap(m);
    	cout << endl;
    	//第二种
    	m.erase(3);
    	PrintMap(m);
    	//清空
    	m.clear();
    }
    
    //主函数
    int main() {
    	test01();
    	system("pause");
    	return 0;
    }
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    3.9.5 map 查找和统计

    函数原型:

    • find(key); //查找key 是否存在,若存在。返回该键的元素的迭代器;若不存在,返回map.end()
    • count(key); //统计key 的元素个数
    #include<iostream>
    #include<map>
    using namespace std;
    
    //查找和统计
    void test01() {
    	map<int, int> m;
    	m.insert(pair<int, int>(1, 10));
    	m.insert(pair<int, int>(3, 30));
    	m.insert(pair<int, int>(4, 40));
    	m.insert(pair<int, int>(2, 20));
    
    	//查找
    	map<int, int>::iterator pos = m.find(3);
    
    	if (pos != m.end()) {
    		cout << "查到了元素key = " << (*pos).first << " value = " << (*pos).second << endl;
    	}
    	else {
    		cout << "没有查找到元素" << endl;
    	}
    
    	//统计
    	//map不允许重复插入
    	cout << "num = " << m.count(3) << endl;
    }
    
    //主函数
    int main() {
    	test01();
    	system("pause");
    	return 0;
    }
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    3.9.6 map 容器排序

    主要技术点:

    • 利用仿函数,可以改变排序规则
    #include<iostream>
    #include<map>
    using namespace std;
    
    class MyCompare {
    public:
    	bool operator()(const int& v1,const int& v2)const {
    		return v1 > v2;
    	}
    };
    
    //打印(利用仿函数)
    void PrintMap(const map<int, int, MyCompare>& m) {
    	for (map<int, int>::const_iterator it = m.begin(); it != m.end(); it++) {
    		cout << "key = " << (*it).first << " value = " << (*it).second << endl;
    	}
    }
    
    //测试
    void test01() {
    	map<int, int, MyCompare>m;
    	m.insert(make_pair(1, 10));
    	m.insert(make_pair(4, 40));
    	m.insert(make_pair(2, 20));
    	m.insert(make_pair(3, 30));
    	PrintMap(m);
    }
    
    //主函数
    int main() {
    	test01();
    	system("pause");
    	return 0;
    }
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    总结:

    • 利用仿函数可以指定map 容器的排序规则
    • 对于自定义数据类型,map必须要指定排序规则,同 set容器
  • 相关阅读:
    HJ20 密码验证合格程序
    小程序中实现待办功能
    Linux下彻底卸载MySQL数据库
    给LaTeX公式添加优美的注解;日更『数据科学』面试题集锦;大学生『计算机』自学指南;个人防火墙;前沿资料/论文 | ShowMeAI资讯日报
    CodeTop 1-20
    Java——String类常见方法
    lua循环
    行业大洗牌,软件测试饱和了?到底怎样才能走出职场困境......
    PHP接口自动化测试框架实现
    【Spring注解必知必会】深度解析@Component注解实现原理
  • 原文地址:https://blog.csdn.net/crisp077/article/details/125491869