STL之set容器代码详解

1 基础概念

在这里插入图片描述

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

本质:

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

set和multiset区别

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

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

2 代码示例

Talk is cheap, show me the code.

#include<iostream>
using namespace std;
#include<set>void printSet(const set<int>& ss)
{for (set<int>::const_iterator it = ss.begin(); it != ss.end(); it++){cout << *it << " ";}cout << endl;
}void printMultiset(const multiset<int>& ss)
{for (multiset<int>::const_iterator it = ss.begin(); it != ss.end(); it++){cout << *it << " ";}cout << endl;
}/*
构造:
set<T> st; //默认构造函数:
set(const set &st); //拷贝构造函数
赋值:
set& operator=(const set &st); //重载等号操作符
*/void test01()
{set<int> s1;s1.insert(10);s1.insert(20);s1.insert(30);s1.insert(40);printSet(s1);set<int> s2(s1);printSet(s2);set<int> s3;s3 = s2;printSet(s3);}/*
大小和交换函数原型:
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
*/void test02()
{set<int> s1;s1.insert(10);s1.insert(20);s1.insert(30);s1.insert(40);printSet(s1);if (s1.empty()){cout << "Empty" << endl;}else{cout << "Size: " << s1.size() << endl;}set<int> s2;s2.insert(100);cout << "交换前:" << endl;printSet(s1);printSet(s2);s1.swap(s2);cout << "交换后" << endl;printSet(s1);printSet(s2);
}/*
插入和删除函数原型:
insert(elem); //在容器中插入元素。
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem); //删除容器中值为elem的元素。
*/void test03()
{multiset<int> s1;s1.insert(10);s1.insert(20);s1.insert(30);s1.insert(40);s1.insert(40);s1.insert(40);s1.insert(40);printMultiset(s1);s1.erase(s1.begin());printMultiset(s1);s1.erase(40);printMultiset(s1);s1.erase(s1.begin(), s1.end());printMultiset(s1);}/*
查找和统计函数原型:
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数
*/void test04()
{multiset<int> s1;s1.insert(10);s1.insert(20);s1.insert(30);s1.insert(40);s1.insert(40);s1.insert(40);s1.insert(40);printMultiset(s1);multiset<int>::iterator pp = s1.find(20);if (pp != s1.end()){cout << "Find It: " << *pp << endl;}else{cout << "No this element" << endl;}cout << s1.count(40) << endl;}/*
set和multiset区别:
set不可以插入重复数据,而multiset可以
set插入数据的同时会返回插入结果,表示插入是否成功
multiset不会检测数据,因此可以插入重复数据
*/void test05()
{set<int> s1;pair<set<int>::iterator, bool> ret = s1.insert(10);if (ret.second){cout << "Insert OK" << endl;}else{cout << "Failed!" << endl;}ret = s1.insert(10);if (ret.second){cout << "Insert OK" << endl;}else{cout << "Failed!" << endl;}}/*
pair对组创建
功能描述:
成对出现的数据,利用对组可以返回两个数据
两种创建方式:
pair<type, type> p ( value1, value2 );
pair<type, type> p = make_pair( value1, value2 );
*/void test06()
{pair<string, int> pp1("zhangsan", 20);pair<string, int> pp2 = make_pair("lisi", 23);cout << pp1.first << " " << pp1.second << endl;cout << pp2.first << " " << pp2.second << endl;
}/*
set容器排序:
set容器默认排序规则为从小到大,掌握如何改变排序规则
主要技术点:
利用仿函数,可以改变排序规则
*/class Person
{
public:Person(string name, int age){this->name = name;this->age = age;}string name;int age;
};class compareP
{
public:bool operator()(const Person& p1, const Person& p2)const //VS2019需要在这个后面加一个const{return p1.age > p2.age;}
};void test07()
{set<Person, compareP> 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, compareP>::iterator it = s.begin(); it != s.end(); it++){cout << (*it).name << " " << (*it).age << endl;}
}int main()
{test07();system("pause");return 0;
}

3 应用场景

C++的STL(标准模板库)中的set容器是一个有序的集合,其中的元素都是唯一的。它基于红黑树实现,提供了高效的插入、删除和查找操作。在实际项目中,set容器经常用于以下场景:

  1. 去重操作:
    当你需要从一组数据中去除重复元素时,set容器是一个理想的选择。由于set只允许存储唯一的元素,插入重复元素时不会导致集合中存在相同的值。这对于需要保持元素唯一性的情况非常有用。

    #include <set>
    #include <iostream>int main() {std::set<int> uniqueNumbers;uniqueNumbers.insert(10);uniqueNumbers.insert(20);uniqueNumbers.insert(10); // 这个插入操作不会改变集合,因为10已经存在for (const auto& num : uniqueNumbers) {std::cout << num << " ";}return 0;
    }
  2. 查找操作:set容器提供了快速的查找操作,因为底层实现是红黑树,保证了对数时间的查找复杂度。这对于需要快速检查元素是否存在于集合中的场景非常有帮助。

    #include <set>
    #include <iostream>int main() {std::set<std::string> names = {"Alice", "Bob", "Charlie"};std::string searchName = "Bob";if (names.find(searchName) != names.end()) {std::cout << searchName << " found in the set." << std::endl;} else {std::cout << searchName << " not found in the set." << std::endl;}return 0;
    }
  3. 有序遍历:
    由于set是有序的容器,可以很容易地实现按顺序遍历元素的需求。这在需要按照一定顺序处理元素的情况下非常有用。

    #include <set>
    #include <iostream>int main() {std::set<int> numbers = {5, 2, 8, 1, 9};for (const auto& num : numbers) {std::cout << num << " ";}return 0;
    }

这些是set容器在实际项目中的一些常见应用场景。根据具体需求,set还可以与其他STL容器和算法结合使用,提供更丰富的功能。

4 实际用例

假设你正在开发一个简单的单词计数应用,需要统计一段文本中不同单词的出现次数。在这种情况下,set容器可以很方便地帮助你实现去重操作,确保每个单词只被计数一次。以下是一个使用set的小demo:

#include <iostream>
#include <set>
#include <map>
#include <string>
#include <sstream>int main() {// 输入的文本std::string text = "This is a sample text with some repeated words. This is just a demo.";// 使用set进行去重操作std::set<std::string> uniqueWords;// 使用map来记录单词出现的次数std::map<std::string, int> wordCount;// 通过istringstream分割文本并处理单词std::istringstream iss(text);std::string word;while (iss >> word) {// 将单词插入set,确保唯一性uniqueWords.insert(word);// 更新单词计数wordCount[word]++;}// 打印去重后的单词std::cout << "Unique words in the text:" << std::endl;for (const auto& uniqueWord : uniqueWords) {std::cout << uniqueWord << " ";}std::cout << std::endl;// 打印每个单词的出现次数std::cout << "Word count:" << std::endl;for (const auto& pair : wordCount) {std::cout << pair.first << ": " << pair.second << " times." << std::endl;}return 0;
}

在这个例子中,set容器确保了每个单词的唯一性,而map用于记录每个单词的出现次数。通过使用set,我们可以方便地获取文本中的唯一单词列表,而不必担心重复计数。这展示了set在项目中用于处理数据唯一性的优势。

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

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

相关文章

Graphpad Prism10.2.1(395) 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

基于51单片机 模拟简易自动自助售货机设计 智能售卖机系统

1、本设计基于STC89C51/52&#xff08;与AT89S51/52、AT89C51/52通用&#xff0c;可任选&#xff09;&#xff0c;拍的时候要备注&#xff0c;不备注默认发STC89C52RC2、使用单片机设计&#xff0c;设有8个按键&#xff0c;3个硬币模拟按键&#xff08;5元、1元、5角&#xff0…

Day31-计算机基础1

Day31-计算机基础1 1. 网络基础介绍1.1 什么是网络&#xff1f;1.2 为什么要有网络&#xff1f;1.3 运维人员需要学习哪些网络知识&#xff1f;1.4 按作用范围对网络分类 2.网络设备知识2.1 网络传输介质及传输信号2.2 网卡设备2.3 中继器&#xff08;RP repeater&#xff09;2…

JavaScript 实现飞机大战

文章目录 一些关键点概览&#xff1a;核心模块的具体实现示例&#xff1a;飞机类&#xff08;Plane&#xff09;的基本结构&#xff1a;子弹类&#xff08;Bullet&#xff09;的基本结构&#xff1a;敌机类&#xff08;Enemy&#xff09;的基本结构&#xff1a; 基于前面定义的…

SQL盲注-实战布尔盲注

环境&#xff1a;win10 靶场&#xff1a;sqli-labs-master 本实验仅供学习参考&#xff01;&#xff01;&#xff01; 1 布尔盲注 盲注就是在 SQL 注入过程中&#xff0c; SQL 语句执行后&#xff0c;查询到的数据不能 回显到前端页面。此时&#xff0c;我们需要利用一些方…

滤波器:工作原理和分类及应用领域?|深圳比创达电子EMC

滤波器在电子领域中扮演着重要的角色&#xff0c;用于处理信号、抑制噪声以及滤除干扰。本文将详细介绍滤波器的工作原理、分类以及在各个应用领域中的具体应用。 一、滤波器的定义和作用 滤波器是一种电子设备&#xff0c;用于选择性地通过或阻塞特定频率范围内的信号。其主…

iOS增量报告生成方案

一&#xff0c;iOS覆盖率报告生成逻辑 iOS覆盖率报告生成与Android有很大的不同&#xff0c;主要的生成逻辑如下&#xff1a; 1&#xff0c;将profraw文件&#xff0c;通过命令xcrun llvm-profdata merge -sparse转换成profdata; 2&#xff0c;再将profdata文件&#xff0c;通…

牛客论坛笔记~

文章目录 Redisspring整合redis实现点赞帖子的赞用户的赞 关注功能热帖排行redis存储验证码、登录凭证、用户信息 kafka阻塞队列kafka![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d35be55986344b548710985cd8ecbd87.png)触发事件处理事件 Redis高级网站数据统计…

如何使用 ArcGIS Pro 制作三维地形图

伴随硬件性能的提高和软件算法的优化&#xff0c;三维地图的应用场景会越来越多&#xff0c;这里为大家介绍一下在ArcGIS Pro怎么制作三维地形图&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM和影像数据&#xff0c;除了DEM和影像数据…

java(框架) springboot-1 基础使用+mybaits使用

学习视频&#xff1a;b站黑马java教程 tomcat spring-boot工程内嵌了tomcat服务器 所有请求经过DispatcherServlet(实现servlet接口的类)(核心控制器/前端控制器)处理&#xff0c;再通过DispatcherServlet转发给各个controller。 最后通过DispatcherServlet给浏览器响应数据…

垃圾收集器底层算法

垃圾收集器底层算法 三色标记 在并发标记的过程中&#xff0c;因为标记期间应用线程还在继续跑&#xff0c;对象间的引用可能发生变化&#xff0c;多标和漏标的情况就有可能发生&#xff0c;这里我们引入“三色标记”来给大家解释下把Gcroots可达性分析遍历对象过程中遇到对象…

02、进程的基础

1.进程的概念 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c; 是系统进行资源分配的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b;在当代…

LeNet5实战——衣服分类

搭建模型训练代码&#xff08;数据处理、模型训练、性能指标&#xff09;——> 产生权重w ——>模型结构c、w测试 配置环境 Pycharm刚配置的环境找不到了-CSDN博客 model.py 导入库 import torch from torch import nn from torchsummary import summary 模型搭…

河北省光伏展

光伏展是指光伏行业的展览会&#xff0c;也被称为太阳能展。光伏展一般是由光伏企业、科研机构、行业协会和专业展览公司等共同举办的。展会内容包括光伏产品、技术、设备、材料、应用等方面的展示和交流。 光伏展通常是光伏行业的重要盛事&#xff0c;吸引了全球范围内的光伏企…

144.乐理基础-根三五音、大三和弦、小三和弦

内容参考于&#xff1a; 三分钟音乐社 上一个内容&#xff1a;143.乐理基础-和弦是什么&#xff1f;和声是什么&#xff1f;三和弦-CSDN博客 必须先看上一个内容&#xff0c;了解什么是和弦、什么是和声&#xff0c;以及三和弦的定义 上一个内容最后写了三和弦的定义&#x…

【C++ 学习】构造函数详解!!!

1. 类的6个默认成员函数的引入 ① 如果一个类中什么成员都没有&#xff0c;简称为空类。 ② 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 ③ 默认成员函数&#xff1a;用户没有显式实现&…

嵌入式学习第二十五天!(网络的概念、UDP编程)

网络&#xff1a; 可以用来&#xff1a;数据传输、数据共享 1. 网络协议模型&#xff1a; 1. OSI协议模型&#xff1a; 应用层实际收发的数据表示层发送的数据是否加密会话层是否建立会话连接传输层数据传输的方式&#xff08;数据包&#xff0c;流式&#xff09;网络层数据的…

基于YOLOv8深度学习的智能道路裂缝检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、目标分割

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

外包干了5天,技术退步明显。。。。。

在湖南的一个安静角落&#xff0c;我&#xff0c;一个普通的大专生&#xff0c;开始了我的软件测试之旅。四年的外包生涯&#xff0c;让我在舒适区里逐渐失去了锐气&#xff0c;技术停滞不前&#xff0c;仿佛被时间遗忘。然而&#xff0c;生活的转机总是在不经意间降临。 与女…

警用移动执法远程视频监控方案:安防视频监控系统EasyCVR+4G/5G移动执法仪

一、背景需求 在现代城市管理中&#xff0c;移动执法仪视频监控方案正逐渐成为一种高效、便捷的管理工具。该方案通过结合移动执法仪和视频监控技术&#xff0c;实现了对城市管理现场的实时监控和取证&#xff0c;有效提升了城市管理水平和效率。 移动执法仪作为现场执法的重…