C++硬货——map头文件【保姆级教学】

简介: 这是代码人需要知道的头文件~

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;
  }
}
复制代码

结果:

网络异常,图片无法展示
|
觉得好就点赞加收藏吧~


作者:白凤倚剑归

链接:https://juejin.cn/post/7109498605408354318

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
C4.
|
1月前
|
算法 程序员 C++
C++标准头文件结构
C++标准头文件结构
C4.
24 0
|
1月前
|
程序员 C语言 C++
C++入门(头文件,命名空间,作用域,输入输出流,引用,缺省参数,函数重载)
C++入门(头文件,命名空间,作用域,输入输出流,引用,缺省参数,函数重载)
|
16天前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
|
29天前
|
IDE 编译器 开发工具
C/C++ IDE环境 (Qt Creator visual studio等) Cmake工程不显示头文件的解决方案
C/C++ IDE环境 (Qt Creator visual studio等) Cmake工程不显示头文件的解决方案
21 0
|
3月前
|
编译器 C++ 容器
【C++学习手札】基于红黑树封装模拟实现map和set
【C++学习手札】基于红黑树封装模拟实现map和set
|
11天前
|
人工智能 NoSQL 机器人
【C++】VS code如何配置使用C++(手把手教学)
【C++】VS code如何配置使用C++(手把手教学)
|
24天前
|
存储 算法 C语言
【C++入门到精通】C++入门 —— map & multimap (STL)
之前我们学习了C++的基础和一些概念,现在将探讨重要的STL组件——map与multimap。map是关联容器,提供有序键值对存储,基于红黑树,支持高效查找、插入和删除。每个键唯一对应一个值。multimap则允许键的重复。两者都提供迭代器支持,但map的键是唯一的,而multimap允许键重复,插入和查找效率不同。更多详情,请查阅官方文档。祝学习愉快!
12 0
|
24天前
|
存储 算法 C++
【C++ map结构 】std::map 和 std::unordered_map 在使用上的差异
【C++ map结构 】std::map 和 std::unordered_map 在使用上的差异
20 0
|
28天前
|
存储 算法 C++
【C++ 包装器类 map】C++ 标准库(std)中的map结构 哈希表(unordered_map)和黑红树(map)教程
【C++ 包装器类 map】C++ 标准库(std)中的map结构 哈希表(unordered_map)和黑红树(map)教程
78 1
|
1月前
|
存储 JSON C++
【C++】容器篇(五)—— map和set的基本介绍
【C++】容器篇(五)—— map和set的基本介绍