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

来源:稀土掘金

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

相关文章
|
9天前
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
14 5
|
1月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
4月前
|
编译器 C++
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
49 0
|
5月前
|
C++ 容器
【C++】map和set封装
【C++】map和set封装
40 2
|
5月前
|
存储 C++ 容器
【C++】map和set深度讲解(下)
【C++】map和set深度讲解(下)
64 2
|
5月前
|
存储 自然语言处理 Java
【C++】map和set深度讲解(上)
【C++】map和set深度讲解(上)
48 2
|
5月前
|
存储 算法 C++
C++一分钟之-扁平化映射与unordered_map
【7月更文挑战第5天】C++的STL `unordered_map`是键值对的快速查找容器,基于哈希表。常见问题包括哈希函数选择、键类型限制、内存管理和迭代顺序不确定性。要避免问题,需优化哈希函数,确保自定义类型支持哈希和比较操作,合理管理内存,不依赖迭代顺序。提供的代码示例展示了如何为自定义类型定义哈希函数并操作`unordered_map`。正确使用能提升代码效率。
51 0
C++一分钟之-扁平化映射与unordered_map
|
5月前
|
存储 C++ 索引
|
5月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
|
5月前
|
存储 C++ 容器
【C++】开散列实现unordered_map与unordered_set的封装
【C++】开散列实现unordered_map与unordered_set的封装
57 0