今天学习map容器
1 map基本概念
简介:
- map中所有元素都是pair 也就是对组。类似py的字典。
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值key自动排序
本质:
- map/multimap属于关联式容器,底层结构是用二叉树实现。
优点:
- 可以根据key值快速找到value值
map和multimap区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复key值元素
2 map构造和赋值
功能描述:
- 对map容器进行构造和赋值操作
函数原型:
构造:
map<T1, T2> mp;//map默认构造函数:map(const map &mp);//拷贝构造函数
赋值:
map& operator=(const map &mp);//重载等号操作符
#include<iostream>
using namespace std;
#include<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 test()
{
map<int, int>m;//默认构造
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(7, 50));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(4, 40));
printMap(m);
//拷贝构造
map<int, int>m1(m);
printMap(m1);
//赋值
map<int, int>m2;
m2 = m;
printMap(m2);
}
int main()
{
test();
system("pause");
return 0;
}
总结:map中所有元素都是成对出现,插入数据时候要使用对组
3 map大小和交换
功能描述:
- 统计map容器大小以及交换map容器
函数原型:
size();//返回容器中元素的数目empty();//判断容器是否为空swap(st);//交换两个集合容器
#include<iostream>
using namespace std;
#include<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<int, int>m;//默认构造
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(7, 50));
m.insert(pair<int, int>(3, 30));
m.insert(pair<int, int>(4, 40));
if (m.empty())
{
cout << "m为空!" << endl;
}
else
{
cout << "m不为空,且大小为:" << m.size() << endl;
}
}
void test02()
{
//交换
map<int, int>m1;
m1.insert(pair<int, int>(1, 10));
m1.insert(make_pair(2, 20));
m1.insert(pair<int, int>(3, 30));
map<int, int>m2;
m2.insert(make_pair(4, 40));
m2.insert(make_pair(5, 50));
cout << "交换前:" << endl;
printMap(m1);
printMap(m2);
cout << "交换后:" << endl;
m1.swap(m2);
printMap(m1);
printMap(m2);
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
总结:
- 统计大小 — size
- 判断是否为空 — empty
- 交换容器 — swap
4 map插入和删除
功能描述:
- map容器进行插入数据和删除数据
函数原型:
insert(elem);//在容器中插入元素。clear();//清除所有元素erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(key);//删除容器中值为key的元素。
#include<iostream>
using namespace std;
#include<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<int, int>m;//插入的3种方式
m.insert(pair<int, int>(1, 10));
m.insert(make_pair(7, 50));
m.insert(map<int,int>::value_type(3,30));
m[5] = 50;
printMap(m);
m.erase(m.begin());
printMap(m);
m.erase(5);///擦除key为5的那个。
printMap(m);
m.erase(m.begin(), m.end());
printMap(m);
m.clear();
printMap(m);
}
int main()
{
test01();
system("pause");
return 0;
}
总结:
- map插入方式很多,记住其一即可
- 插入 — insert
- 删除 — erase
- 清空 — clear
5 map查找和统计
功能描述:
- 对map容器进行查找数据以及统计数据
函数原型:
find(key);//查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();count(key);//统计key的元素个数, 只可以是0或者1
#include<iostream>
using namespace std;
#include<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<int, int>m;//插入的3种方式
m.insert(pair<int, int>(1, 10));
m.insert(make_pair(7, 50));
m.insert(map<int,int>::value_type(3,30));
m[5] = 50;
printMap(m);
//统计
map<int, int>::iterator pos = m.find(7);
if (pos != m.end())
{
cout << "找到了元素,key= " << (*pos).first << "value =" << (*pos).second << endl;
}
else {
cout << "未找到元素!" << endl;
}
//查找
int num = m.count(5);
cout<< "num = " << num << endl;
}
void test02()
{
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
总结:
- 查找 — find (返回的是迭代器)
- 统计 — count (对于map,结果为0或者1)
6 map容器排序
学习目标:
- map容器默认排序规则为 按照key值进行 从小到大排序,掌握如何改变排序规则,实现从大到小排序!!!
主要技术点:
- 利用仿函数,可以改变排序规则
vs2019 需要加const bool operator()(int a, int b)const
#include<iostream>
using namespace std;
#include<map>
class Compare
{
public:
bool operator()(int a, int b)const
{
return a > b;
}
};
void test01()
{
map<int, int,Compare>m;//插入的3种方式
m.insert(pair<int, int>(1, 10));
m.insert(make_pair(7, 50));
m.insert(map<int,int>::value_type(3,30));
for (map<int, int, Compare>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "key是" << it->first << "value是" << it->second << endl;
}
cout << endl;
}
void test02()
{
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
总结:
- 利用仿函数可以指定map容器的排序规则
- 对于自定义数据类型,map必须要指定排序规则,同set容器
终于学完啦map!!!!!!!!!!!!!
可以开始复习考试了!
打个小广告,欢迎关注我的公众号“麦香E站”,分享人工智能,信通学习,数学提高,外语学习,生活理财等多方面知识以及我多年积累的学习资源分享~
公众号后台回复 “编程” 获取我多年来积攒的海量编程电子书~
后台回复“latex”获取我倾力所作latex快速入门手册~


760

被折叠的 条评论
为什么被折叠?



