<C++>map 容器快速上手|自定义数据类型排序的避坑理解(下)

简介: <C++>map 容器快速上手|自定义数据类型排序的避坑理解

1.4、map 插入和删除

功能:


map容器进行插入数据和删除数据

函数原型:


insert(elem); 在容器中插入元素。

clear(); 清除所有元素

erase(pos); 删除pos迭代器所指的元素,返回下一个元素的迭代器。

erase(beg, end); 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。

erase(key); 删除容器中值为key的元素。

代码示例:

// 插入和删除
void test03()
{
  //插入操作
  map<int, int> mp;
  //第一种插入方式
  mp.insert(pair<int, int>(1, 10));
  //第二种插入方式,推荐
  mp.insert(make_pair(2, 20));
  //第三种插入方式
  mp.insert(map<int, int>::value_type(3, 30));
  //第四种插入方式,不推荐:当不存在此值就会自动创建键,值为0
  mp[4] = 40;
  // 模拟误操作
  cout << "下标为6的值为:"<<mp[6] << endl;
  printInfo(mp);
  //删除,按迭代器
  mp.erase(mp.begin());
  printInfo(mp);
  // 删除,按下标
  mp.erase(3);
  mp.erase(6);
  printInfo(mp);
  //清空
  mp.erase(mp.begin(), mp.end());
  mp.clear();
  printInfo(mp);
}

1.5、map 查找和统计

功能:


对map容器进行查找数据以及统计数据

函数原型:


find(key); 查找key是否存在,若存在,返回该键对应的迭代器;若不存在,返回end();

count(key); 统计key的元素个数

代码示例:

// 查找和统计
void test04()
{
  map<int, int>mp;
  mp.insert(pair<int, int>(1, 10));
  mp.insert(pair<int, int>(2, 20));
  mp.insert(pair<int, int>(4, 40));
  mp.insert(pair<int, int>(3, 30));
  //查找
  map<int, int>::iterator pos = mp.find(3);
  if (pos != mp.end())
  {
    cout << "找到了元素 key = " << (*pos).first << " value = " << (*pos).second << endl;
  }
  else
  {
    cout << "未找到元素" << endl;
  }
  //统计
  int num = mp.count(2);
  cout << "num = " << num << endl;
}

2、自定义排序规则

与 set 容器一样,定义排序规则需要在创建容器的时候就指定,同样需要借助仿函数,也就是后面会提到的 谓词


2.1、内置数据类型的排序

// 内置数据类型排序
class descmp
{
public:
  bool operator()(int val1, int val2) const {
      // 指定为降序排列 
    return val1 > val2;
  }
};
void test05()
{
  cout << "降序排序插入:" << endl;
  map<int, int,descmp> mp;
  mp.insert(make_pair(3, 2));
  mp.insert(make_pair(7, 4));
  mp.insert(make_pair(6, 1));
  mp.insert(make_pair(8, 5));
  mp.insert(make_pair(1, 3));
  for (auto it = mp.begin(); it != mp.end(); it++) {
    cout << "key = " << it->first << " value = " << it->second << endl;
  }
}

f846da14167348fbb1bfb16a39637862.png


仿函数需要指定为 const 常函数类型,否则将会出现数据不完整错误


2.2、自定义数据类型的排序

进行自定义数据类型排序的时候要注意,使用仿函数定义排序规则是针对 键 的,因此要把定义的类、结构体放在泛型的第一个参数上(别问,问就是我看了半天源码才发现的…)


接下来看看我设计的小案例:

// 自定义数据类型排序
class Hero
{
public:
  // 构造方法
  Hero(string name, int age) :name(name), age(age) {}
  // 属性
  string name;
  int age;
};
class Cmp_hero
{
public:
  bool  operator()(const Hero& h1, const Hero& h2)const {
    return h1.age < h2.age;
  }
};
void test06()
{
  map<Hero, int, Cmp_hero> mh;
  Hero h1("赵云", 42);
  Hero h2("曹操", 43);
  Hero h3("孙策", 39);
  Hero h4("刘备", 40);
  Hero h5("关羽", 41);
  mh.insert(make_pair(h1, 12000));
  mh.insert(make_pair(h2, 14000));
  mh.insert(make_pair(h3, 10000));
  mh.insert(make_pair(h4, 18000));
  mh.insert(make_pair(h5, 16000));
  for (auto t = mh.begin(); t != mh.end(); t++) {
    cout << "姓名:" << t->first.name << " 年龄:" << t->first.age
      << " 赏金:" << t->second << endl;
  }
}

0224ba425fb84980a9f0f34aae282b2a.png


其实更合理的设计应该是按照赏金大小来排序,我之所以这样设计是想介绍一下当键是类的时候该怎么处理:仿函数参数列表中的变量若是 引用形式 必须用 const 修饰(若不是引用形式则不用加 const),而且函数也应该是常函数。


map 容器键值对存储的使用是非常广泛的,下篇博客来做一个员工分组的具体案例,巩固一些 STL常用容器的使用,大家可以订阅专栏,方便查阅和复习。


目录
相关文章
|
28天前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
35 0
|
2月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
62 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
2月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
68 5
|
2月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
78 2
|
14天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
147 77
|
22天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
6天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
22 3
实战~如何组织一个多容器项目docker-compose
|
15天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
59 3
|
22天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
54 7
|
22天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
30 5