map头文件
简介:
- map中所有的元素都是pair对
- pair中第一个元素是key(键值),起到索引的作用,第二个元素是value(实值)
- 所有的元素都会根据元素的键值自动排序
本质:
- map/multimap属于关联式容器,底层结构是用二叉树实现的
优点:
- 可以根据key值快速找到value值
map和multimap的区别:
- map不允许容器中有重复的key值元素
- multimap允许容器中有重复的key值元素
PS: 接下来我会从(map的构造和赋值)、(map的大小交换)、(map插入和删除)、(map的查找和统计)、(map容器排序)等方面来介绍map容器,每个案例都会有代码和图片说明~
display函数源码:
void display(map<int, int>mp) {
for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {
cout << "key值:" << it->first << "value值:" << it->second << endl;
}
cout << endl;
}
复制代码
map的构造和赋值
- 构造
- 1.map<T1,T2>mp;map的默认构造函数
- 2.map(const map &mp);map的拷贝构造函数
- 赋值
- =号赋值
代码如下:
//map的构造和赋值
//map的构造和赋值
void test01() {
//默认构造函数
map<int, int>mp;
//给mp插数
mp.insert(pair<int, int>(1, 23));
mp.insert(pair<int, int>(66, 45));
mp.insert(pair<int, int>(10, 63));
mp.insert(pair<int, int>(52, 37));
mp.insert(pair<int, int>(52, 38));//这个不会存进去
mp.insert(pair<int, int>(100, 520));
//打印输出
display(mp);
//拷贝构造函数
map<int, int>mp2(mp);
display(mp2);
//赋值
map<int, int>mp3 = mp2;
display(mp3);
}
复制代码
结果:
map的大小和交换
- size();返回容器中元素的数目
- empty();判断容器是否为空
- swap();交换两个容器
代码如下:
//map的大小和交换
void test02() {
//默认构造函数
map<int, int>mp;
//给mp插数
mp.insert(pair<int, int>(1, 23));
mp.insert(pair<int, int>(66, 45));
mp.insert(pair<int, int>(10, 63));
mp.insert(pair<int, int>(52, 37));
mp.insert(pair<int, int>(52, 38));//这个不会存进去
mp.insert(pair<int, int>(100, 520));
//打印输出
display(mp);
//map是否为空
if (mp.empty()) {
cout << "mp为空!" << endl;
}
else {
cout << "mp不为空!" << endl;
cout << "mp容器的大小:" << mp.size() << endl;
}
map<int, int>mp2;
mp2.insert(pair<int, int>(10, 90));
mp2.insert(pair<int, int>(1, 77));
mp2.insert(pair<int, int>(66, 15));
mp2.insert(pair<int, int>(50, 67));
mp2.insert(pair<int, int>(20, 9));
mp2.insert(pair<int, int>(100, 666));
//交换
cout << "交换后:" << endl;
mp.swap(mp2);
display(mp);
}
复制代码
结果:
map的插入和删除
- insert(elem);在容器中插入元素
- clear();清空所有元素
- erase(pos);删除pos迭代器所指的元素,返回下一个元素的迭代器
- erase(beg,end);删除区间[beg,end)的所有元素,返回下一个元素的迭代器
- erase(key);删除容器中值为key的元素
代码如下:
//map的插入和删除
void test03() {
//插入(四种插入)
map<int, int>mp;
//第一种
mp.insert(pair<int, int>(10, 520));
//第二种
mp.insert(make_pair(21, 666));
//第三种
mp.insert(map<int, int>::value_type(1, 999));
//第四种
mp[16] = 1314;
display(mp);
//删除
mp.erase(mp.begin());
display(mp);
mp.erase(21);
display(mp);
//清空
mp.clear();
//或者
//mp.erase(mp.begin(), mp.end());
display(mp);
}
复制代码
结果:
map查找和统计
- find(key);查找key是否存在,返回该键的元素的迭代器;若不在,返回map.end();
- count(key);统计key的元素个数(0或1)
代码如下:
//map查找的统计
void test04() {
//默认构造函数
map<int, int>mp;
//给mp插数
mp.insert(pair<int, int>(1, 23));
mp.insert(pair<int, int>(66, 45));
mp.insert(pair<int, int>(10, 63));
mp.insert(pair<int, int>(52, 37));
mp.insert(pair<int, int>(52, 38));//这个不会存进去
mp.insert(pair<int, int>(100, 520));
//打印输出
display(mp);
//查找(创建一个迭代器来找key值)
map<int, int>::iterator f = mp.find(66);
if (f != mp.end()) {
cout << "找到该元素!" << endl;
cout << "key:" << f->first << " value:" << f->second << endl;
}
else {
cout << "没找到!" << endl;
}
//统计(在map中的统计要么是0要么是1)
int cnt1 = mp.count(66);
int cnt2 = mp.count(60);
cout << "key=66的个数:" << cnt1 << endl;
cout << "key=60的个数:" << cnt2 << endl;
}
复制代码
结果:
map排序
- 利用仿函数,改变排序规则
仿函数代码:
//仿函数
class Compare {
public:
bool operator()(int a, int b)const {
return a > b;
}
};
复制代码
PS: 一定要加上const,这是VS2022的需求
测试代码:
//map排序
void test05() {
//默认构造函数
map<int, int>mp;
//给mp插数
mp.insert(pair<int, int>(1, 23));
mp.insert(pair<int, int>(66, 45));
mp.insert(pair<int, int>(10, 63));
mp.insert(pair<int, int>(52, 37));
mp.insert(pair<int, int>(52, 38));//这个不会存进去
mp.insert(pair<int, int>(100, 520));
//打印输出
display(mp);
//更改规则的map
map<int, int, Compare>mp2;
mp2.insert(make_pair(1, 23));
mp2.insert(make_pair(66, 45));
mp2.insert(make_pair(10, 63));
mp2.insert(make_pair(52, 37));
mp2.insert(make_pair(52, 38));//这个数不会被插入
mp2.insert(make_pair(100, 520));
//打印输出
for (map<int, int, Compare>::iterator it1 = mp2.begin(); it1 != mp2.end(); it1++) {
cout << "key值:" << it1->first << " " << "value值:" << it1->second << endl;
}
}
复制代码
结果:
觉得好就点赞加收藏吧~