STL常见容器之set/multiset、map/multimap
创始人
2024-05-30 15:02:49
0

set/multiset—集合容器

  • 特点
    • 所有元素都会在插入时自动被排序
  • 本质
    • set/multiset属于关联式容器,底层结构是二叉树实现
  • set和multiset区别
    • set不可以插入重复数据,而multiset可以
    • set插入数据的同时会返回插入结果,表示插入是否成功
    • multiset不会检测数据,因此可以插入重复数据
    • set不允许容器中有复杂的元素
    • multiset允许容器中有复杂的元素
  • 构造和赋值
    • 构造
      • set < T >st
      • set(const set &st)
    • 赋值
      • set& operator=(const set &st)
  • 大小和交换
    • size()
    • empty()
    • swap(st)
  • 插入和删除
    • 原型
      • insert(elem)
      • clear()
      • erase(pos)
      • erase(beg, end)
      • erase(elem)—删除容器中值为elem的元素
  • 查找和统计
    • 对set容器中进行查找数据及统计数据
    • 原型
      • find(key)—查找key是否存在,返回该键的元素的迭代器,若不存在则返回set.end()
      • count(key)—统计key的元素个数—只有0/1两种选择
  • pair对组创建
    • 功能
      • 成对出现的数据,利用对组可以返回两个数据
    • 创建方式
      • pair p (value1, value2)
      • pair p = make_pair(value1, value2)
        #include#includeusing namespace std;void test(void){// 第一种pair Person1("zhangsan", 18);cout << " name " << Person1.first << " age " << Person1.second << endl;// 第二种pair Person2 = make_pair("lisi", 28);cout << " name " << Person2.first << " age " << Person2.second << endl;}int main(){test();return 0;}
    
  • set容器排序
    • set容器默认排序规则为从小到大,如何改变规则
    • 利用仿函数
  • set容器存放内置数据类型如何改变规则
      #include#include#includeusing namespace std;// 仿函数class myCompare{public:bool operator()(int i1, int i2){return i1 > i2;}};void myPrint(const set& st){for (set::iterator it = st.begin(); it != st.end(); it++){cout << *it << endl;}}void test(void){set st;st.insert(10);st.insert(30);st.insert(90);st.insert(40);myPrint(st);cout << "=================================" << endl;set sts ;sts.insert(10);sts.insert(30);sts.insert(90);sts.insert(40);    for (set::iterator it = sts.begin(); it != sts.end(); it++){cout << *it << endl;}}int main(){test();return 0;}
    
  • set容器存放自定义数据类型如何改变规则—必须要自定义排序规则
      #include#include#includeusing namespace std;class Person{public:string m_name;int m_age;Person(string name, int age){this->m_name = name;this->m_age = age;}};// 仿函数class myCompare{public:bool operator()(const Person& i1, const Person& i2){return i1.m_age > i2.m_age;}};void test(void){set Infor;Person p1("zhangsan", 18);Person p2("lisi", 28);Person p3("wangwu", 20);Infor.insert(p1);Infor.insert(p2);Infor.insert(p3);for(set::iterator it = Infor.begin(); it != Infor.end(); it++){cout << "name " << it->m_name << " age " << it->m_age << endl;}}int main(){test();return 0;}
    

map/multimap容器

  • 基本概念
    • map中每个元素都是pair
    • pair中第一个元素为key,起到索引作用,第二个元素为value
    • 所有元素都会根据元素的键值自动排序
  • 本质
    • map/multimap属于关联式容器,底层结构是二叉树
  • 优点
    • 可以根据key快速找到value
  • map和multimap区别
    • map不允许容器中有重复key值元素
    • multimap允许容器中有重复key值元素
  • 构造和赋值
    • 原型
      • map< T1, T2 > mp
      • map(const map &mp)
    • 赋值
      • map& operator=(const map &mp)
      #include#includeusing namespace std;void test(void){map m;m.insert(pair(1, 10));m.insert(pair(2, 20));m.insert(pair(3, 30));for(map::iterator it = m.begin(); it != m.end(); it++){cout << "first " << it->first << " second "<< it->second << endl;}}int main(){test();return 0;}
    
  • 大小和交换
    • size()
    • empty()
    • swap(st)
  • 插入和删除
    • insert(elem)
        // 第一种m.insert(pair(1, 10));// 第二种---推荐m.insert(make_pair(2, 20));// 第三种m.insert(map::value_type(3, 30));// 第四种m[4] = 40;
      
    • clear()
    • erase(pos)
    • erase(beg, end)
    • erase(key)—删除容器中值为key的元素
  • 查找和统计
    • find(key)—找到返回迭代器,.first是key,.second是value,没找到返回m.end()
    • count(key)—返回整型有几个,只有0/1
  • map容器排序
    • map容器默认排序规则为按照key值进行从小到大排序,依然是利用仿函数可以改变排序规则
    • map< int, int, myCompare >

相关内容

热门资讯

122.(leaflet篇)l... 听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
Vue使用pdf-lib为文件... 之前也写过两篇预览pdf的,但是没有加水印,这是链接:Vu...
PyQt5数据库开发1 4.1... 文章目录 前言 步骤/方法 1 使用windows身份登录 2 启用混合登录模式 3 允许远程连接服...
Android studio ... 解决 Android studio 出现“The emulator process for AVD ...
Linux基础命令大全(上) ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维...
再谈解决“因为文件包含病毒或潜... 前面出了一篇博文专门来解决“因为文件包含病毒或潜在的垃圾软件”的问题,其中第二种方法有...
南京邮电大学通达学院2023c... 题目展示 一.问题描述 实验题目1 定义一个学生类,其中包括如下内容: (1)私有数据成员 ①年龄 ...
PageObject 六大原则 PageObject六大原则: 1.封装服务的方法 2.不要暴露页面的细节 3.通过r...
【Linux网络编程】01:S... Socket多进程 OVERVIEWSocket多进程1.Server2.Client3.bug&...
数据结构刷题(二十五):122... 1.122. 买卖股票的最佳时机 II思路:贪心。把利润分解为每天为单位的维度,然后收...
浏览器事件循环 事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间࿰...
8个免费图片/照片压缩工具帮您... 继续查看一些最好的图像压缩工具,以提升用户体验和存储空间以及网站使用支持。 无数图像压...
计算机二级Python备考(2... 目录  一、选择题 1.在Python语言中: 2.知识点 二、基本操作题 1. j...
端电压 相电压 线电压 记得刚接触矢量控制的时候,拿到板子,就赶紧去测各种波形,结...
如何使用Python检测和识别... 车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计...
带环链表详解 目录 一、什么是环形链表 二、判断是否为环形链表 2.1 具体题目 2.2 具体思路 2.3 思路的...
【C语言进阶:刨根究底字符串函... 本节重点内容: 深入理解strcpy函数的使用学会strcpy函数的模拟实现⚡strc...
Django web开发(一)... 文章目录前端开发1.快速开发网站2.标签2.1 编码2.2 title2.3 标题2.4 div和s...