3.9 map/multimap 容器
3.9.1 map基本概念
简介:
-
map所有元素都是pair
-
pair中第一个元素为key(键值),起索引作用,第二个元素为value (实值)
-
所有元素都会根据元素的键值自动排序
本质:
-
map/multimap 属于关联式容器,底层结构是用二叉树实现
优点:
-
可以根据key值快速找到vallue值
map和multimap区别:
-
map不允许容器中有重复key值元素
-
multimap允许有重复key值元素
3.9.2 map构造和赋值
功能描述:
-
对map容器进行构造和赋值操作
函数原型:
构造:
-
map<T1,T2>mp; //map默认构造函数
-
map(const map & mp); //拷贝构造函数
赋值:
-
map& operator = (const map &mp); //重载等号操作符
示例:
#include <iostream> using namespace std; #include<string> //加入map容器头文件 #include<map> //map容器 构造和赋值 //打印 printMap 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容器 m map<int, int>m; //插入数据 m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(5, 50)); 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); } int main() { test01(); system("pause"); return 0; }
效果图:
总结:
map中所有元素都是成对出现,插入数据时候要使用对组
3.9.3 map大小和交换
功能描述:
-
统计map容器大小以及交换map容器
函数原型:
-
size(); //返回容器中元素的数目
-
empty(); //判断容器是否为空
-
swap(st); //交换两个集合容器
示例:
#include <iostream> using namespace std; #include<string> //加入map容器头文件 #include<map> //map 容器大小和交换 //大小 void test01() { //创建map容器 map<int, int>m; //插入数据 m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(5, 50)); m.insert(pair<int, int>(3, 30)); //判断容器是否为空 if (m.empty()) { cout << "为空" << endl; } else { cout << "不为空" << endl; cout << "m的大小为" << m.size() << endl; } } 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 test02() { //创建map容器 m m2 map<int, int> m; //插入数据 m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(2, 50)); m.insert(pair<int, int>(3, 30)); map<int, int> m2; //插入数据 m2.insert(pair<int, int>(4, 100)); m2.insert(pair<int, int>(5, 500)); m2.insert(pair<int, int>(6, 300)); cout << "交换前" << endl; //遍历 printMap(m); printMap(m2); m.swap(m2); cout << "交换后" << endl; //遍历 printMap(m); printMap(m2); } int main() { // test01(); test02(); system("pause"); return 0; }
效果图:
总结:
-
统计大小 ---size
-
判断是否为空 ---empty
-
交换容器 ---swap
3.9.4 map插入和删除
功能描述:
-
map容器进行插入和删除数据
函数原型:
-
insert(elem); //在容器中插入元素
-
clear(); //清除所有元素
-
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器
-
erase(beg,end); //删除区间[beg,end]的所有元素,返回下一个元素的迭代器
-
erase(key); //删除容器中值为key的元素
示例:
#include <iostream> using namespace std; #include<string> //加入map容器头文件 #include<map> //map插入和删除 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容器 m 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; //[]不建议插入,用途:可以利用key访问到value //cout << m[4] << endl; //遍历 printMap(m); //删除 cout << "删除第一个元素" << endl; m.erase(m.begin()); printMap(m); //删除 cout << "删除key为3的元素" << endl; m.erase(3); printMap(m); //按键值删除 cout << "删除key为30元素" << endl;//没有就不操作 m.erase(30); printMap(m); //清空 cout <<"清空" << endl; m.erase(m.begin(), m.end()); m.clear(); printMap(m); } int main() { test01(); system("pause"); return 0; }
效果图:
总结:
-
map插入方式很多,记住其一即可
-
插入 ----insert
-
删除 ---delete
-
清空 ---clear
3.9.5 map查找和统计
功能描述:
-
对map容器进行查找数据以及统计数据
函数原型:
-
find(key); //查找key是否存在,返回该键的元素的迭代器;若不存在,返回set.end();
-
count(key); //统计key的元素的个数
示例:
#include<iostream> using namespace std; #include<map> //map容器查找和统计 void test01() { //查找 map<int, int> m; m.insert(pair<int, int>(1, 10)); m.insert(make_pair<int, int>(2, 20)); m.insert(map<int, int>::value_type(3, 30)); m[3] = 40; map<int, int>::iterator pos = m.find(3);//返回的是迭代器 if (pos!=m.end()) { cout << "查到了元素 key = " << (*pos).first << " value = " << pos->second << endl; } else { cout << "未找到" << endl; } //统计 //map不允许插入重复key元素,count 统计而言 结果要么是0 要么是1 //multimap的count统计 可能大于1; int num = m.count(3); cout << "num= " << num << endl; } int main() { test01(); system("pause"); return 0; }
效果图:
总结:
-
查找 ---find (返回的是迭代器)
-
统计 --count(对于map,结果为0或1)
3.9.6 map容器排序
学习目标:
-
map容器默认排序规则为按照key值进行 从大到小排序 ,掌握如何改变排序规则
主要技术点:
-
利用仿函数,可以改变排序规则
示例:
map存放内置数据类型
#include<iostream> using namespace std; #include<map> class MyCompare { public: bool operator()(int v1, int v2) { //降序 return v1 > v2; } }; //map容器 排序 void test01() { map<int, int,MyCompare>m; m.insert(make_pair(1, 10)); m.insert(make_pair(2, 20)); m.insert(make_pair(4, 40)); m.insert(make_pair(3, 30)); m.insert(make_pair(6, 60)); //遍历 for (map<int, int,MyCompare>::iterator it = m.begin(); it != m.end(); it++) { cout << "key = " << it->first << " value = " << it->second << endl; } cout << endl; } int main() { test01(); system("pause"); return 0; }
效果图:
map存放自定义数据类型
#include <iostream> using namespace std; #include<string> #include<map> //map容器 排序,存放自定义数据类型 class Person { public: Person(string name, int age) { this->m_Age = age; this->m_Name = name; } string m_Name; int m_Age; }; class comparePerson { public: bool operator()(int v1,int v2) { return v1 > v2; } }; void test01() { //自定义数据类型 都会指定排序规则 //创建Person对象 Person p1("刘备", 30); Person p2("关羽", 28); Person p3("张飞", 25); Person p4("赵云", 25); Person p5("曹操", 27); //插入数据 map<int,Person, comparePerson>m; m.insert(pair<int,Person>(1,p1)); m.insert(pair<int, Person>(2, p2)); m.insert(pair<int, Person>(3, p3)); m.insert(pair<int, Person>(4, p4)); m.insert(pair<int, Person>(5, p5)); for (map<int,Person, comparePerson>::iterator it = m.begin(); it != m.end(); it++) { cout << (*it).first<<" 姓名 " <<it->second.m_Name << " 年龄为 " <<it->second.m_Age << endl; } } int main() { test01(); system("pause"); return 0; }
效果图:
总结:
-
利用仿函数可以指定map容器的排序规则
-
对于自定义数据类型,map必须要指定排序规则,同set容器