详解c++STL—容器set/multiset

news/2025/2/11 16:50:17/

目录

1、set基本概念

1.1、功能

1.2、本质:

1.3、set和multiset区别

2、set构造和赋值

2.1、功能描述

2.1、构造

2.3、赋值

2.4、示例

3、set大小和交换

3.1、功能描述

3.2、函数原型

3.2、示例

4、set插入和删除

4.1、功能描述

4.2、函数原型

4.3、示例

5、set查找和统计

5.1、功能描述

5.2、函数原型

5.3、示例

6、set和multiset区别

6.1、区别

6.2、示例

7、pair对组创建

7.1、功能描述

7.2、两种创建方式

7.3、示例

8、set容器排序

8.1、主要技术点

8.2、示例

1、set基本概念

1.1、功能

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

1.2、本质:

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

1.3、set和multiset区别

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

2、set构造和赋值

2.1、功能描述

创建set容器以及赋值

2.1、构造

  • set<T> st; //默认构造函数:
  • set(const set &st); //拷贝构造函数

2.3、赋值

  • set& operator=(const set &st); //重载等号操作符

2.4、示例

//set容器的构造和赋值
void printSet(set<int> s) {for (set<int>::iterator it = s.begin(); it != s.end();it++) {cout << *it << " ";}cout << endl;
}void test01() {//1、默认构造set<int> s;//插入数据只能用inserts.insert(10);s.insert(60);s.insert(40);s.insert(50);s.insert(30);s.insert(20);printSet(s);//2、拷贝构造set<int> s1(s);printSet(s1);//3、赋值set<int> s2;s2 = s1;printSet(s2);}int main() {test01();system("pause");return 0;
}

注意事项:

set容器插入数据时用insert();

3、set大小和交换

3.1、功能描述

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

3.2、函数原型

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器

3.2、示例

//set容器的大小和交换
void printSet(set<int> s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test01() {set<int> s;s.insert(10);s.insert(60);s.insert(40);printSet(s);set<int> s1;s1.insert(100);s1.insert(600);s1.insert(400);printSet(s1);//大小//1、判断是否为空if (s.empty()){cout << "set容器为空" << endl;}else {cout << "set容器不为空:" << endl;//2、访问大小cout << "大小为:" << s.size() << endl;}//交换cout << "交换前:" << endl;printSet(s);printSet(s1);s1.swap(s);cout << "交换后:" << endl;printSet(s);printSet(s1);}int main() {test01();system("pause");return 0;
}

4、set插入和删除

4.1、功能描述

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

4.2、函数原型

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(elem); //删除容器中值为elem的元素。

4.3、示例

//set容器的插入和删除
void printSet(set<int> s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test01() {set<int> s;//1、插入s.insert(10);s.insert(60);s.insert(40);printSet(s);//2.删除s.erase(s.begin());	//删除指定位置printSet(s);s.erase(s.begin(),s.end());	//删除指定区间printSet(s);//3、清空  清空后打印一个换行s.erase(s.begin(),s.end());s.clear();printSet(s);}int main() {test01();system("pause");return 0;
}

5、set查找和统计

5.1、功能描述

  • 对set容器进行查找数据以及统计数据

5.2、函数原型

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
  • count(key); //统计key的元素个数

5.3、示例

//set容器的查找和统计
void printSet(set<int> s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test01() {set<int> s;s.insert(10);s.insert(60);s.insert(40);printSet(s);//1、查找set<int>::iterator it = s.find(10);if (it != s.end()) {cout << "查找到值:" << *it << endl;}else {cout << "未找到!" << endl;}//2、统计cout << "个数:" << s.count(10) << endl;}int main() {test01();system("pause");return 0;
}

注意事项:

1、对于set而言,统计结果只有两个:0,1;

6、set和multiset区别

6.1、区别

  • set不可以插入重复数据,而multiset可以
  • set插入数据的同时会返回插入的bool结果,表示插入是否成功
  • multiset不会检测数据,直接返回一个迭代器,因此可以插入重复数据

6.2、示例

//set和multiset的区别
void printSet(set<int> s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test01() {set<int> s;pair<set<int>::iterator,bool> pai = s.insert(10);if (pai.second) {cout << "第一次插入10成功" << endl;cout << *pai.first << endl;}else {cout << "第一次插入10失败" << endl;}pai = s.insert(10);if (pai.second) {cout << "第二次插入10成功" << endl;cout << *pai.first << endl;}else {cout << "第二次插入10失败" << endl;}multiset<int> ms;multiset<int>::iterator it =  ms.insert(20);cout <<"第一次插入:"<< * it << endl;it = ms.insert(20);cout << "第二次插入:" << *it << endl;it = ms.insert(20);cout << "第三次插入:" << *it << endl;
}int main() {test01();system("pause");return 0;
}

7、pair对组创建

7.1、功能描述

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

7.2、两种创建方式

  • pair<type, type> p ( value1, value2 );
  • pair<type, type> p = make_pair( value1, value2 );

7.3、示例

//pair对组的创建
void test01() {//第一种方式创建pair<string, int> p("zhangsan",18);cout << "姓名:" << p.first << "年龄:" << p.second << endl;//第二种方式创建pair<string,int>p1 = make_pair("lisi", 20);cout << "姓名:" << p1.first << "年龄:" << p1.second << endl;
}int main() {test01();
}

8、set容器排序

问题描述:set容器默认排序规则为从小到大,如何改变排序规则?

8.1、主要技术点

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

8.2、示例

示例1: set存放内置数据类型

//排序规则,降序
class myCompare {
public:bool operator()(int v1,int v2)const {return v1 > v2;}
};void test() {set<int> s;//插入时,默认升序s.insert(10);s.insert(60);s.insert(20);s.insert(40);s.insert(30);s.insert(50);//遍历for (set<int>::iterator it = s.begin(); it != s.end();it++) {cout << *it << " ";}cout << endl;//改变排序规则——降序set<int,myCompare> s1;s1.insert(10);s1.insert(60);s1.insert(20);s1.insert(40);s1.insert(30);s1.insert(50);for (set<int,myCompare>::iterator it = s1.begin(); it != s1.end(); it++) {cout << *it << " ";}cout << endl;
}int main() {test();
}

总结:利用仿函数可以指定set容器的排序规则

示例2: set存放自定义数据类型

class Person {
public:Person(string name, int age) :m_name(name), m_age(age) {}string m_name;int m_age;
};class myCompare {
public:bool operator()(Person p1,Person p2)const {return p1.m_age > p2.m_age;}
};
void test() {set<Person,myCompare> s;Person p1("刘备", 23);Person p2("关羽", 27);Person p3("张飞", 25);Person p4("赵云", 21);s.insert(p1);s.insert(p2);s.insert(p3);s.insert(p4);for (set<Person>::iterator it = s.begin(); it != s.end();it++) {cout << "姓名:" << it->m_name << "年龄:" << it->m_age << endl;}}
int main() {test();
}

总结:

对于自定义数据类型,set必须指定排序规则才可以插入数据


http://www.ppmy.cn/news/74095.html

相关文章

【redis】redis为什么这么快?高性能设计之epoll和I/O多路复用深度解析

系列文章目录 文章目录 系列文章目录前言一、before 学习I/O多路复用之前多路复用 需要解决的问题 一对一性能差结论 需要让一个进程同时处理多个连接 二、I/O多路复用模型1、是什么&#xff1f;一句话 2、redis单线程如何处理那么多并发客户端连接&#xff0c;为什么单线程&am…

机器学习Dry Bean分析

1. introduction This 本项目旨在对DryBean数据集进行详细分析&#xff0c;以揭示数据中的潜在信息和特征关系。DryBean数据集包含了7种不同品种的土耳其干豆数据&#xff0c;每种豆子都有16个特征&#xff0c;这些特征可以帮助我们了解豆子的形状、大小和形态。通过对这些特征…

面试篇——软件测试面经(干货面试必问精简篇)

面试篇——软件测试面经(干货面试必问精简篇) 文章目录 面试篇——软件测试面经(干货面试必问精简篇)第一部分 干货必备,常问的内容什么是软件测试软件测试的目的软件测试的定义**常见的软件开发过程模型****单元测试(Unit Testing)****1.2 集成测试(Integration Testing)****…

C语言函数大全-- x 开头的函数(1)

C语言函数大全 本篇介绍C语言函数大全-- x 开头的函数 1. xdr_accepted_reply 1.1 函数说明 函数声明函数功能bool_t xdr_accepted_reply(XDR *xdrs, struct accepted_reply *ar);用于将 RPC&#xff08;远程过程调用&#xff09;应答中的 accepted_reply 结构体编码为 XDR…

01 Android开机启动之整体分析

Android开机启动之整体分析 一、Android系统整体架构图 Android是谷歌开发的一款基于Linux的开源操作系统 PowerManagement:系统最底层是电源管理,只有通过电源上电,系统才能开启 Linux kernel:驱动层,里面包括Audio、Carmera、usb等各种外设的驱动程序。 HAL层:硬件…

大数据课程-学习十九周总结

4.2.8.修改表 4.2.8.1.表重命名 基本语法&#xff1a; alter table old_table_name rename to new_table_name; – 把表score3修改成score4 alter table score3 rename to score4; 4.2.8.2.增加/修改列信息 – 1:查询表结构 desc score4; – 2:添加列 alter table score4 ad…

【模电实验】基本放大电路的研究实验

实验四 基本放大电路的研究实验&#xff08;2小时&#xff09; —、实验目的 &#xff08;1&#xff09;充分认识分压式偏置放大电路的电压放大作用&#xff0c;了解其静态工作点的调节、测量&#xff0c;认识截止失真和饱和失真现象&#xff0c;了解消除截止失真和饱和失真…

redis变慢解决梳理

使用层面 1、操作复杂比如聚合等操作不要再server上做 2、操作bigKey内存释放与申请都影响 3、redis过期策略有关&#xff0c;如果某一个时间有大量过期&#xff0c;过期也是主线程操作&#xff0c;这个也会影响客户端的响应&#xff0c;可以使用命令查看&#xff0c;可以把过期…