C++(week11): C++基础 第六章:关联式容器 set、map

文章目录

  • 第六章:关联式容器
    • 1.set
      • (1)set的特点
      • (2)set的构造
      • (3)set的查找操作 (set访问元素)
      • (4)set的插入操作、pair
      • (5)set的遍历
    • 2.map
      • (1)map的特点
      • (2)map的构造
      • (3)map的查找操作
      • (4)map的插入操作
      • (5)map的下标操作 (重点)
      • (5)map的遍历

第六章:关联式容器

1.set

(1)set的特点

①set有去重效果,元素必须唯一
②set会默认升序排序


(2)set的构造

1.默认的无参构造函数,创建一个空集合

set<int> nums;

2.初始化列表

set<int> nums = {1,2}; //推荐使用
set<int> nums2{3,4};   
set<int> nums3({5,6});

3.复制或赋值

set<int> nums3 = nums2;	 //推荐使用
set<int> nums3(nums);    //C++可以用小括号赋值

4.用另一个set的迭代器复制或赋值

set<int> nums4(nums2.begin(),nums2.end());

在这里插入图片描述


(3)set的查找操作 (set访问元素)

0.set不支持下标访问

set<int> nums = {1,2,3};
set[0];  //error

1.count()
在这里插入图片描述
count()本是查找元素在容器中的个数。而set有去重效果,最多存一份。所以返回值要么是1(存在),要么是0(不存在)。

size_t cnt = nums2.count(30);
cout << cnt << endl;

2.find()
在这里插入图片描述
若能找到,返回迭代器。

set<int>::iterator it = nums2.find(2);
if(it != nums2.end()){cout << "该元素存在:" << *it << endl;
}else{cout << "该元素不存在。" << endl;
}

(4)set的插入操作、pair

在这里插入图片描述
insert的返回类型是pair<iterator, bool>。
pair定义在头文件< utility >中,类似于结构体,可以存储两种不同类型的变量。

#include <utility>
void test1(){pair<int,string> num = {1,"wangdao"};cout << num.first << ":" << num.second << endl;pair<int,string> num2(2, "hello");cout << num2.first << ":" << num2.second << endl;string str("world");pair<string, double> num3(str, 4.7);cout << num3.first << ":" << num3.second << endl;
}

insert的返回值:pair<iterator, bool>
1.插入1个元素

pair<set<int>::iterator, bool> ret = nums.insert(2);
//auto ret = nums.insert(2);
if(ret.second){cout << "插入成功:" << *(ret.first) << endl;
}else{cout << "插入失败,该元素已存在:" << *(ret.first) << endl;
}

2.插入一堆元素
(1)迭代器插入

void insert(InputIt first, InputIt last); //插入一堆元素,返回类型就是void
set<int> nums2{7,8,9,20,35};
nums.insert(nums2.begin(), nums2.end());

(2)初始化列表插入
在这里插入图片描述

nums.insert({100,99,98,97});
for(auto & ele : nums){cout << ele << " ";
}
cout << endl;

(5)set的遍历

set不支持下标访问。不能用普通for循环进行遍历。

可以 迭代器遍历、增强for循环遍历

//set遍历
void test3(){set<int> nums{1,2,3,4,5};//nums[0]; //set不支持下标操作//1.增强for循环for(auto & ele : nums){cout << ele << " ";}cout << endl;//2.迭代器for(auto it = nums.begin(); it != nums.end(); ++it){cout << *it << " ";}cout << endl;
}

  • set容器不支持下标访问,因为没有operator[] 重载函数
  • 不能通过set的迭代器直接修改key值,set的底层实现是红黑树,结构稳定,不允许直接修改。

在这里插入图片描述



2.map

(1)map的特点

①map有去重效果,key值必须唯一:创建map对象时,舍弃了一些元素,key值相同的元素被舍弃。key不同,即使value相同也能保留
②map会自动升序排序:默认以key值为参考进行升序排列


(2)map的构造

map中存放的元素的类型是pair类型(键值对),构造map有三种方式:

void test0(){map<int,string> number = {{1,"beijing"},{2,"world"},{3,"wangdao"},pair<int,string>(4,"hubei"),pair<int,string>(5,"wangdao"),make_pair(9,"shenzhen"),make_pair(3,"beijing"),make_pair(6,"shanghai")}; 
}

①key值相同,插入失败。根据key值来去重。
②按照key值升序排序

思考,如果key是自定义类型Point,如何重载,让编译器知道Point的排序方式?


(3)map的查找操作

1.count()
查找key,找到返回1,没找到返回0
在这里插入图片描述


2.find()
查找key,找到返回元素的迭代器,没找到返回尾迭代器end()
在这里插入图片描述


(4)map的插入操作

insert

在这里插入图片描述

1.插入一个元素
在这里插入图片描述

2.插入一组元素,迭代器

3.插入一组元素,初始化列表
在这里插入图片描述


(5)map的下标操作 (重点)

在这里插入图片描述

map进行下标访问时,
(1)下标是key值,返回对应的value。
(2)如果进行下标操作时下标值传入一个不存在的key,那么会将这个key和空的value(默认的value值)插入到map中。
(3)下标访问可以进行写操作 (只是对value进行写操作,不影响排序)

map底层也是红黑树,但是写操作修改的是value,不影响key值,因此不会影响排序。而set只有key值,不可以进行下标操作。

在这里插入图片描述


(5)map的遍历

1.使用迭代器方式遍历map,注意访问map的元素pair的内容时的写法

for(auto it = number.begin(); it != number.end(); ++it){cout << it->first << " " << it->second << endl; //*(). 等价于 ->
}   
cout << endl;
map<int,string>::iterator it = number.begin();
while(it != number.end()){cout << (*it).first << " " << (*it).second << endl;++it;
}
cout << endl;

2.使用增强for循环变量map

for(auto & ele : _dict){cout << ele.first << " " << ele.second  << endl;
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

入度与出度在数据结构中的应用

文章目录 应用案例1. 邻接矩阵2. 邻接链表3. 邻接集&#xff08;字典实现&#xff09;4. 入度列表&#xff08;基于邻接链表计算&#xff09; 特别补充3. 邻接集计算入度&#xff08;补充&#xff09;4. 邻接多重表&#xff08;概念介绍&#xff09; 入度和出度是图论中的概念&…

手机误删图片怎么办?2个照片恢复大师来帮忙,轻松找回

手机照片早已成为我们日常生活中的一部分&#xff0c;记录着欢笑、泪水等各种瞬间。但有时候&#xff0c;因为各种原因&#xff0c;它们会突然消失&#xff0c;让人痛心疾首。照片恢复有哪些方法呢&#xff1f;别急&#xff0c;今天就给大家带来2位照片恢复大师&#xff0c;它们…

【手写数据库内核组件】0501多线程并发模型,任务分发多工作者执行架构实现,多线程读写状态时volatile存储类型使用技巧

0501 多线程管理 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 0501 多…

[C++] 由浅入深理解面向对象思想的组成模块

文章目录 (一) 类的默认成员函数(二) 构造函数构造函数的特征构造函数示例无参构造带参构造 冲突:全缺省参数的构造函数与无参构造函数 &#xff08;三&#xff09;析构函数特性析构函数的析构过程解析 &#xff08;四&#xff09;拷贝构造函数什么是拷贝构造&#xff1f;特性为…

数据结构——单链表详解(超详细)(2)

前言&#xff1a; 上一篇文章小编简单的介绍了单链表的概念和一些函数的实现&#xff0c;不过为了保证文章的简洁&#xff0c;小编把它分成了两篇来写&#xff0c;这一篇小编紧接上一篇文章继续写单链表函数功能的实现&#xff1a; 目录&#xff1a; 1.单链表剩余函数的编写 1.…

MBR40150FCT-ASEMI无人机专用MBR40150FCT

编辑&#xff1a;ll MBR40150FCT-ASEMI无人机专用MBR40150FCT 型号&#xff1a;MBR40150FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;40A 最大循环峰值反向电压&#xff08;VRRM&a…

小程序-视图与逻辑

一、页面导航 声明式导航 编程式导航 导航传参 1.声明式导航传参 2.编程式导航传参 3.在onload中接收导航参数 二、页面事件 下拉刷新 上拉触底 三、生命周期 分类 生命周期函数分类 1.应用的生命周期函数 2.页面的生命周期函数 四、WXS脚本 基础语法 wxs的特点 五、案…

智能硬件——0-1开发流程

文章目录 流程图1. 市场分析具体分析 2. 团队组建2. 团队组建早期团队配置建议配置一&#xff1a;基础型团队 (4人)配置二&#xff1a;扩展型团队 (6人)配置三&#xff1a;全面型团队 (7人) 3. 产品需求分析4. ID设计&#xff08;Industrial Design, 工业设计&#xff09;5. 结…

MathType加载项被word禁用怎么办 MathType加载到Word不能用

Word中的MathType加载项是指将MathType软件与Word文档进行关联的一项功能。它允许用户在Word中直接使用MathType的功能&#xff0c;方便地输入和编辑数学公式等内容。通过加载项&#xff0c;MathType的强大数学公式编辑能力可以与Word的文档处理功能相结合&#xff0c;提高工作…

谷歌账号异常的常见8种状态,前三种有望立刻恢复,越往后越难(1)

生搬硬套列夫•托尔斯泰的一句话名言“幸福的家庭都是相似的,不幸的家庭各有各的不幸。” 工作、学习、娱乐中需要使用谷歌账号的朋友可能会发现&#xff0c;幸福的人就是谷歌账号一直都好好的&#xff0c;每次登陆都如所愿&#xff0c;丝滑无比。但是“不幸”的人就会发现&am…

【微信小程序知识点】自定义构建npm

在实际开发中&#xff0c;随着项目的功能越来越多&#xff0c;项目越来越复杂&#xff0c;文件目录也变得很繁琐&#xff0c;为了方便进行项目的开发&#xff0c;开发人员通常会对目录结构进行优化调整&#xff0c;例如&#xff1a;将小程序源码放到miniprogram目录下。 &…

电脑型号数据源的性能提升:新一代技术的突破

随着科技的不断发展&#xff0c;电脑型号的数据源性能也得到了显著的提升。新一代技术的突破使得电脑型号的数据源更加准确、全面且易于使用。本文将从代码的角度解释这一突破&#xff0c;并参考挖数据平台的内容&#xff0c;向大家介绍电脑型号数据源的性能提升。 首先&#…

【scrapy】——个人笔记

scrapy简介 Scrapy&#xff0c;Python开发的一个快速、高层次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛&#xff0c;可以用于数据挖掘、监测和自动化测试。 Scrapy吸引人的地方在于它是一个框架&#xff0c;任何人都可…

HEVC编码中的MPM(最可能模式,Most Probable Mode)

简介 最近看到有文章用视频编码时的MPM参数来映射特征并用于数字取证&#xff0c;故做该文章记录。 HEVC&#xff08;高效视频编码&#xff09;中的MPM&#xff08;最可能模式&#xff0c;Most Probable Mode&#xff09;用于预测帧内块的模式&#xff0c;以提高编码效率并减…

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【ABB】示教器可编程按钮的配置

【ABB】示教器可编程按钮的配置 操作流程演示 操作流程 首先我要配置的是如图所示控制器上的四个按钮&#xff0c;这四个按钮是可以自定义功能的。 点击【菜单】点击【Control Panel】点击【ProgKeys】即可配置对应按键功能 演示 点击【菜单】 点击【配置可编程按键】 这里…

12306高铁票如何打印电子发票?

高铁票报销凭证电子版如何打印&#xff1f; 高铁票报销目前没有电子发票形式&#xff0c;只有纸质版报销凭证&#xff0c;不过虽然没有电子版报销凭证&#xff0c;但是可以通过多种方式获取纸质版报销凭证。 报销凭证只能打印一次&#xff0c;丢失不能补打&#xff0c;请妥善…

cpp 强制转换

一、static_cast static_cast 是 C 中的一个类型转换操作符&#xff0c;用于在类的层次结构中进行安全的向上转换&#xff08;从派生类到基类&#xff09;或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换&#xff08;即从派生…

Stable Diffusion教程|视频转绘有手就会Ebsynth Utility应用详解

过去这几个月&#xff0c;相信很多同行都已经见识到了AIGC强大的风格化绘图能力&#xff0c;不仅能够做出高品质的美术资产&#xff0c;还可以将制作效率大幅提高&#xff0c;这也是AI概念如今在资本市场受热捧的重要原因。 不过&#xff0c;目前我们所见到的大部分图形&#…

把当前img作为到爷爷的背景图

&#xff08;忽略图大小不一致&#xff0c;一般UI给的图会刚好适合页面大小&#xff0c;我这网上找的图&#xff0c;难调大小&#xff0c;我行内的就自己随便写的宽高&#xff09;&#xff0c;另外悄悄告诉你最后有简单方法&#xff5e;&#xff5e; 先来看看初始DOM结构代码 …