<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常用容器的使用,大家可以订阅专栏,方便查阅和复习。


目录
相关文章
|
11天前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
30 10
|
11天前
|
搜索推荐 算法 数据处理
【C++数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】
本文介绍了希尔排序算法的实现及相关知识。主要内容包括: - **任务描述**:实现希尔排序算法。 - **相关知识**: - 排序算法基础概念,如稳定性。 - 插入排序的基本思想和步骤。 - 间隔序列(增量序列)的概念及其在希尔排序中的应用。 - 算法的时间复杂度和空间复杂度分析。 - 代码实现技巧,如循环嵌套和索引计算。 - **测试说明**:提供了测试输入和输出示例,帮助验证代码正确性。 - **我的通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了代码运行的测试结果。 通过这些内容,读者可以全面了解希尔排序的原理和实现方法。
42 10
|
11天前
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
30 7
|
11天前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
26 5
|
3月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
79 2
|
2月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
48 0
|
3月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
96 2
|
3月前
|
前端开发 JavaScript 索引
JavaScript 数组常用高阶函数总结,包括插入,删除,更新,反转,排序等,如map、splice等
JavaScript数组的常用高阶函数,包括遍历、插入、删除、更新、反转和排序等操作,如map、splice、push、pop、reverse等。
29 0
|
11天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
51 18
|
11天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
37 13

热门文章

最新文章