当前位置: 首页 > news >正文

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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2 Java的基本程序设计结构(基本语法1)
  • 外包干了1个月,技术明显退步。。。
  • SparkStreaming--scala
  • Apache访问机制配置
  • 阿里通义音频生成大模型 FunAudioLLM 开源
  • el-popover或el-popconfirm中button不展示问题
  • 从零开始学习c++全套通关系列(第二章)万字总结,建议收藏!
  • 混合贪心算法求解地铁线路调度
  • 结合C++智能指针聊聊观察者模式
  • WPF 框架 Prism IActiveAware接口使用
  • 前端项目本地的node_modules直接上传到服务器上无法直接使用(node-sasa模块报错)
  • boost::regex_replace的使用
  • 海外ASO:iOS与谷歌优化的相同点和区别
  • LabVIEW电子水泵性能测试平台
  • 四个“一体化”——构建数智融合时代下的一站式大数据平台
  • 【译】JS基础算法脚本:字符串结尾
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • in typeof instanceof ===这些运算符有什么作用
  • JS函数式编程 数组部分风格 ES6版
  • Mithril.js 入门介绍
  • Node项目之评分系统(二)- 数据库设计
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 读懂package.json -- 依赖管理
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 突破自己的技术思维
  • 想使用 MongoDB ,你应该了解这8个方面!
  • # Java NIO(一)FileChannel
  • # Panda3d 碰撞检测系统介绍
  • #DBA杂记1
  • #define、const、typedef的差别
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一) springboot详细介绍
  • (一)Docker基本介绍
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)EOS中账户、钱包和密钥的关系
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .net 反编译_.net反编译的相关问题
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET连接MongoDB数据库实例教程
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ C++ ] STL---string类的模拟实现
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [2019红帽杯]Snake
  • [AIGC] 解题神器:Python中常用的高级数据结构
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [C++]: 模板进阶