【黑马程序员】STL之set和map容器

文章目录

  • set/multiset容器
    • set基本概念
      • 简介
      • 区别
    • set的构造和赋值
      • 功能描述
      • 函数原型
      • 代码示例
      • 运行结果
    • set的大小和交换
      • 功能描述
      • 函数原型
      • 代码示例
      • 运行结果
    • set的插入和删除
      • 功能描述
      • 函数原型
      • 代码示例
      • 运行结果
    • set查找和统计
      • 函数原型
      • 代码示例
      • 运行结果
    • set和multiset区别
      • 区别
      • 代码示例
      • 运行结果
    • pair队组创建
      • 功能描述
      • 创建方式
      • 代码示例
      • 运行结果
    • set容器排序
      • 代码示例
  • map容器
    • map基本概念
      • 简介
      • 本质
      • 优点
      • map和multimap区别
    • map的构造和赋值
      • 函数原型
      • 代码示例
    • map大小和交换
      • 代码示例
    • map插入和删除
      • 函数原型
      • 代码示例
    • map查找和统计
      • 函数原型
      • 代码示例
    • map容器排序
      • 主要技术点
      • 代码示例

set/multiset容器

set基本概念

简介

  • 所有元素都会在插入时被自动排序

  • set/multiset属于关联式容器,底层结构是用二叉树实现

区别

  • set不允许容器中有重复的元素

  • multiset允许容器中有重复的元素

set的构造和赋值

功能描述

  • 创建set容器及赋值

函数原型

在这里插入图片描述

代码示例

#include <iostream>
#include <set>using namespace std;void printSet(const set<int> &s) {for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test() {// 默认构造set<int> s1;s1.insert(1);s1.insert(3);s1.insert(4);printSet(s1);// 拷贝构造set<int> s2(s1);printSet(s2);// 重载等号操作符set<int> s3 = s1;printSet(s3);
}int main() {test();return 0;
}

运行结果

在这里插入图片描述

set的大小和交换

功能描述

  • 统计set大小及交换set容器

函数原型

在这里插入图片描述

代码示例

#include <iostream>
#include <set>using namespace std;void printSet(const set<int> &s) {for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test() {// 默认构造set<int> s1;s1.insert(1);s1.insert(3);s1.insert(2);s1.insert(4);printSet(s1);cout << "set容器的大小:" << s1.size() << endl;cout << "set容器是否为空:" << s1.empty() << endl;set<int> s2;s2.insert(7);s2.insert(5);cout << "交换前:" << endl;printSet(s1);printSet(s2);s1.swap(s2);cout << "交换后:" << endl;printSet(s1);printSet(s2);
}int main() {test();return 0;
}

运行结果

在这里插入图片描述

set的插入和删除

功能描述

  • set容器进行插入和删除数据

函数原型

在这里插入图片描述

代码示例

#include <iostream>
#include <set>using namespace std;void printSet(const set<int> &s) {for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test() {// 默认构造set<int> s1;for (int i = 0; i < 10; i++) {// 使用insert向容器中插入元素s1.insert(i);}printSet(s1);cout << "erase删除指定位置的元素:";s1.erase(s1.begin());cout << "erase删除给定元素:";s1.erase(3);printSet(s1);cout << "erase 清空";s1.erase(s1.begin(), s1.end());printSet(s1);cout << "clear 清空";s1.clear();
}int main() {test();return 0;
}

运行结果

在这里插入图片描述

set查找和统计

函数原型

在这里插入图片描述

代码示例

#include <iostream>
#include <set>using namespace std;void printSet(const set<int> &s) {for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test() {// 默认构造set<int> s1;for (int i = 0; i < 10; i++) {// 使用insert向容器中插入元素s1.insert(i);}printSet(s1);set<int>::iterator pos = s1.find(5);if (pos != s1.end()) {cout << "找到了" << endl;} else {cout << "没找到" << endl;}cout << "统计给定值的出现次数:";int count = s1.count(2);// 对于set而言,统计的结果要么是1要么是0cout << count << endl;
}int main() {test();return 0;
}

运行结果

在这里插入图片描述

set和multiset区别

区别

  • set不可以插入重复数据,而multiset可以

  • set插入数据的同时会返回插入结果,表示插入是否成功

  • multiset不会检测数据,因此可以插入重复数据

代码示例

#include <iostream>
#include <set>using namespace std;void printSet(const multiset<int> &s) {for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test1() {set<int> s;pair<set<int>::iterator, bool> ret = s.insert(1);if (ret.second) {cout << "第一次插入成功" << endl;} else {cout << "第一次插入失败" << endl;}ret = s.insert(1);if (ret.second) {cout << "第二次插入成功" << endl;} else {cout << "第二次插入失败" << endl;}
}void test2() {// 默认构造multiset<int> s1;s1.insert(1);s1.insert(1);s1.insert(2);s1.insert(4);s1.insert(4);s1.insert(4);printSet(s1);int count = s1.count(4);cout << "4的数量:" << count << endl;
}int main() {test1();test2();return 0;
}

运行结果

在这里插入图片描述

pair队组创建

功能描述

  • 成对出现数据,利用队组可以返回两个数据

创建方式

在这里插入图片描述

代码示例

#include <iostream>using namespace std;void test() {pair<int, int> p1(1, 1);cout << p1.first << " " << p1.second << endl;pair <string, string> p2 = make_pair("Tom", "cat");cout << p2.first << " " << p2.second << endl;}int main() {test();return 0;
}

运行结果

在这里插入图片描述

set容器排序

  • set默认插入的时候是从小到大排序的

  • 利用仿函数可以实现,从大到小排序

代码示例

#include <iostream>
#include <set>using namespace std;class Person {
public:Person(string name, int age) {this->name = name;this->age = age;}// 对于自定义的数据类型需要指定排序规则
//    bool operator<(const Person &p) const {
//        if (name < p.name) {
//            return true;
//        } else if (name > p.name) {
//            return false;
//        } else {
//            return age < p.age;
//        }
//    }
//string name;int age;
};class comparePerson{
public:bool operator()(const Person &p1, const Person &p2) {return p1.age > p2.age;}
};void printPersonSet(const set <Person> &s) {for (set<Person>::const_iterator it = s.begin(); it != s.end(); it++) {cout << "name:" << (*it).name << " age: " << (*it).age << endl;}
}void test() {Person p1("sad1", 1);Person p2("sad2", 2);Person p3("sad3", 3);Person p4("sad4", 4);Person p5("sad5", 5);Person p6("sad6", 6);Person p7("sad6", 5);set <Person, comparePerson> s1;s1.insert(p1);s1.insert(p2);s1.insert(p3);s1.insert(p4);s1.insert(p5);s1.insert(p6);s1.insert(p7);for (set<Person>::const_iterator it = s1.begin(); it != s1.end(); it++) {cout << "name:" << (*it).name << " age: " << (*it).age << endl;}
}int main() {test();return 0;
}

map容器

map基本概念

简介

  • map中所有元素都是pair

  • pair中第一个元素为key (键值),起到索引作用,第二个元素为value (实值)

  • 所有元素都会根据元素的键值自动排序

本质

  • map/multimap属于关联式容器,底层结构是用二叉树实现

优点

  • 可以根据key值快速找到value值

map和multimap区别

  • map中不允许有重复的key值元素

  • multimap中不允许有重复的key值元素

map的构造和赋值

函数原型

在这里插入图片描述

代码示例

#include <iostream>
#include <map>using namespace std;void printMap(map<int, int> mp) {for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}void test() {cout << "默认构造函数:";map<int, int> mp;for (int i = 0; i < 5; i++) {mp[i] = i;}printMap(mp);cout << "拷贝构造函数:";map<int, int> mp1(mp);printMap(mp1);cout << "重载等号操作符:";map<int, int> mp2 = mp;printMap(mp2);
}int main() {test();return 0;
}

map大小和交换

代码示例

#include <iostream>
#include <map>using namespace std;void printMap(map<int, int> mp) {for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}void test() {cout << "默认构造函数:";map<int, int> mp;for (int i = 0; i < 5; i++) {mp[i] = i;}printMap(mp);cout << "mp大小: " << mp.size() << endl;if (mp.empty()) {cout << "mp为空" << endl;} else {cout << "mp不为空" << endl;}map<int, int> mp1;for (int i = 5; i > 0; i--) {mp1[i] = i;}printMap(mp1);cout << "交换后" << endl;mp1.swap(mp);printMap(mp);printMap(mp1);
}int main() {test();return 0;
}

map插入和删除

函数原型

在这里插入图片描述

代码示例

#include <iostream>
#include <map>using namespace std;void printMap(map<int, int> mp) {for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}void test() {cout << "mp insert: ";map<int, int> mp;pair<int, int> p1(4, 6);pair<int, int> p2(2, 1);pair<int, int> p3(5, 3);pair<int, int> p4(1, 6);mp.insert(p1);mp.insert(p2);mp.insert(p3);mp.insert(p4);printMap(mp);cout << "mp删除指定key: ";mp.erase(2);printMap(mp);cout << "mp删除指定pos: ";mp.erase(mp.begin());printMap(mp);cout << "mp删除指区间所有元素: ";mp.erase(mp.begin(), mp.end());printMap(mp);cout << "清空mp";mp.clear();printMap(mp);
}int main() {test();return 0;
}

map查找和统计

函数原型

在这里插入图片描述

代码示例

#include <iostream>
#include <map>using namespace std;void printMap(map<int, int> mp) {for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}void test() {cout << "mp insert: ";map<int, int> mp;pair<int, int> p1(4, 6);pair<int, int> p2(2, 1);pair<int, int> p3(5, 3);pair<int, int> p4(1, 6);mp.insert(p1);mp.insert(p2);mp.insert(p3);mp.insert(p4);printMap(mp);map<int, int>::iterator pos = mp.find(3);if (pos != mp.end()) {cout << "3 find" << endl;} else {cout << "3 not find" << endl;}cout << "查找给定值出现的次数:" << mp.count(1) << endl;
}int main() {test();return 0;
}

map容器排序

主要技术点

  • 利用仿函数,可以改变函数规则

代码示例

#include <iostream>
#include <map>using namespace std;class DescCompare {
public:// error: no matching function for call to object of type 'const DescCompare',所以需要使用const修饰bool operator()(int a, int b) const {return a > b;}
};void test() {cout << "mp insert: ";map<int, int, DescCompare> mp;pair<int, int> p1(4, 6);pair<int, int> p2(2, 1);pair<int, int> p3(5, 3);pair<int, int> p4(1, 6);mp.insert(p1);mp.insert(p2);mp.insert(p3);mp.insert(p4);for (map<int, int, DescCompare>::const_iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}int main() {test();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM(6)

JMM JVM定义了一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果.在此之前,C/C直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台下的内存模型差异,有可能导致程序在一套平台上并发完全正常,而在另…

深入解剖指针(4)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 回调函数 qsort使用举例 使用qsort函数排序整型数据 使用qsort排序结构数据 qsort函数的模拟实现 回调函数 回调函数就是一个通过函数指…

《Spring Security 简易速速上手小册》第10章 未来趋势与高级话题(2024 最新版)

文章目录 10.1 云原生安全性趋势10.1.1 基础知识10.1.2 重点案例&#xff1a;保护微服务通信10.1.3 拓展案例 1&#xff1a;容器安全最佳实践10.1.4 拓展案例 2&#xff1a;自动化安全审计和合规性检查 10.2 反应式编程与 Spring Security10.2.1 基础知识10.2.2 重点案例&#…

nginx-图片模块

./configure --with-http_image_filter_module location / {root html;index index.html index.htm;if ($arg_w "") {set $arg_w -;}if ($arg_h "") {set $arg_h -;}image_filter resize $arg_w $arg_h;image_filter_jpeg_quality 95; } 访问: 1234…

CSS锥形渐变:conic-gradient()

画一个扇形图&#xff0c;使用常规方法可能很难画&#xff0c;但是用锥形渐变的话非常好画 <style>.pattern{width: 100px; height: 100px;border-radius: 50%;background: conic-gradient(yellow 30deg , black 30deg , black 90deg , yellow 90deg ,yellow 150d…

Git分布式版本控制系统——git学习准备工作

一、Git仓库介绍 开发者可以通过Git仓库来存储和管理文件代码&#xff0c;Git仓库分为两种&#xff1a; 本地仓库&#xff1a;开发人员自己电脑上的Git仓库 远程仓库&#xff1a;远程服务器上的Git仓库 仓库之间的运转如下图&#xff1a; commit&#xff1a;提交&#xff…

Decoupled Knowledge Distillation解耦知识蒸馏

Decoupled Knowledge Distillation解耦知识蒸馏 现有的蒸馏方法主要是基于从中间层提取深层特征&#xff0c;而忽略了Logit蒸馏的重要性。为了给logit蒸馏研究提供一个新的视角&#xff0c;我们将经典的KD损失重新表述为两部分&#xff0c;即目标类知识蒸馏&#xff08;TCKD&a…

c++之旅——第四弹

大家好啊&#xff0c;这里是c之旅第三弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 本篇文章的主…

如何对比 MySQL 主备数据的一致性?

随着业务范围的扩大&#xff0c;很多企业为了保障核心业务的高可用性&#xff0c;选择了 MySQL 主从架构&#xff0c;这一套方案通常具备主备数据同步、数据备份与恢复、读写分离、高可用切换等特性&#xff0c;是一种相当成熟可靠的数据库架构方案。然而这套方案在特定情况下可…

Redis小白入门教程

Redis入门教程 1. Redis入门1.1 Redis简介1.2 Redis服务启动与停止1.2.1 Redis下载1.2.2 服务启动命令1.2.3 客户端连接命令1.2.4 修改Redis配置文件 2. Redis数据类型2.1 五种常用数据类型介绍2.1.1 字符串操作命令2.1.2 哈希操作命令2.1.3 列表操作命令2.1.4 集合操作命令2.1…

双周回顾#006 - 这三个月

断更啦~~ 上次更新时间 2023/11/23, 断更近三个月的时间。 先狡辩下&#xff0c;因为忙、着实忙。因为忙&#xff0c;心安理得给断更找了个借口&#xff0c;批评下自己~~ 这三个月在做啥&#xff1f;跨部门援助&#xff0c;支援公司互联网的 ToC 项目&#xff0c;一言难尽。 …

【C语言】InfiniBand 驱动mlx4_ib_init和mlx4_ib_cleanup

一、中文讲解 这两个函数是Linux内核模块中对于Mellanox InfiniBand 驱动程序初始化和清理的函数。 mlx4_ib_init()函数是模块初始化函数&#xff0c;使用__init宏标注&#xff0c;表示该函数只在模块加载时运行一次。 函数执行的步骤如下&#xff1a; 1. 通过alloc_ordered_w…

数据结构——lesson5栈和队列详解

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感谢大家的观看与…

ElasticSearch开篇

1.ElasticSearch简介 1.1 ElasticSearch&#xff08;简称ES&#xff09; Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。能够达到实时搜索&#xff0c;稳定&#xff0c;可靠&#xff0c;快速&#xff0c;安装使用方便。 1.2 ElasticSearch与Lucene的关…

模拟器抓HTTP/S的包时如何绕过单向证书校验(XP框架)

模拟器抓HTTP/S的包时如何绕过单向证书校验&#xff08;XP框架&#xff09; 逍遥模拟器无法激活XP框架来绕过单向的证书校验&#xff0c;如下图&#xff1a; ​​ 解决办法&#xff1a; 安装JustMePlush.apk安装Just Trust Me.apk安装RE管理器.apk安装Xposedinstaller_逍遥64位…

智能边缘小站 CloudPond(低延迟、高带宽和更好的数据隐私保护)

智能边缘小站 CloudPond(低延迟、高带宽和更好的数据隐私保护) 边缘小站的主要功能是管理用户在线下部署的整机柜设施&#xff0c;一个边缘小站关联一个华为云指定的区域和一个用户指定的场地&#xff0c;相关的资源运行状况监控等。 边缘计算 迈入5G和AI时代&#xff0c;新…

利用redis实现秒杀功能

6、秒杀优化 这个是 图灵 的redis实战里面的一个案例 6.1 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤…

基于单片机的红外遥控解码程序设计与实现

摘要:该文介绍基于士兰半导体芯片(SC6122)的红外发射遥控器,通过单片机解码程序,实现红外遥控信号的解码和接收。红外接收头与单片机特定的引脚连接,通过设置单片机定时计数器,采样来自红外接收头的高、低电平宽度解码遥控信号。该解码程序设计主要应用在LED数码显示控制…

电机的极数和槽数,机械角度和电角度,霍尔IC,内外转子

什么是电机的极数和槽数&#xff1f; 【第7集】② 正弦波驱动的转矩脉动、正弦电流的时序和相位变化、超前角控制&#xff08;超前角调整&#xff09;、正弦波驱动的各种波形 - 电源设计电子电路基础电源技术信息网站_罗姆电源设计R课堂 (rohm.com.cn) 下面为您介绍表示电机…

Java虚拟机(JVM)从入门到实战【上】

Java虚拟机&#xff08;JVM&#xff09;从入门到实战【上】&#xff0c;涵盖类加载&#xff0c;双亲委派机制&#xff0c;垃圾回收器及算法等知识点&#xff0c;全系列6万字。 一、基础篇 P1 Java虚拟机导学课程 P2 初识JVM 什么是JVM Java Virtual Machine 是Java虚拟机。…