STL学习笔记-set/multiset容器(集合)

2024-03-14 14:38

本文主要是介绍STL学习笔记-set/multiset容器(集合),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介:
set中包含的元素是唯一的,集合中的元素是按照排序规则存放的,不能指定插入的位置
set采用红黑树变体的数据结构实现,属于 平衡二叉树。在插入和删除操作上比vector快
set不能用at(pos)和[]直接存取元素
multiset与set区别:set支持唯一键值,每个元素只能出现一次,但multiset中同一元素可以出现多次
不能直接修改set/multiset中元素的值,因为该容器是自动排序的。如果要修改一个元素值,应先删除,再插入

头文件:
#include<set>

基本操作:
set<int> s;    //默认从小到大排列
s.insert(20); //插入元素
s.insert(30); 
s.insert(20); 
s.insert(40); 
//遍历set
for(set<int>::iterator it = s.begin(); it != s.end(); it++) {
cout << *it << endl;
}
//删除元素
while(!s.empty()) {
set<int>::iterator it2 = s.begin();
s.erase(it2);
}

改变自动排序的规则:
set<int> s1; //从小到大
set<int, less<int>> s2; //从小到大
set<int, greater<int>> s3; //从大到小
s3.insert(10); //插入元素
s3.insert(30); 
s3.insert(20); 
s3.insert(40); 
//注意此时的迭代器也要变
for(set<int, greater<int>>::iterator it = s3.begin(); it != s3.end(); it++) {
cout << *it << endl;
}

如何对自定义数据类型(如 student类)按照规则进行自动排序?----> 仿函数应用
//自定义数据类型
class Student{
public:
int age;
char name[64];    
void printStuInfo() {
cout << "age : " << age << endl;
}
};

//仿函数
struct CompStudent{
bool operator()(const Student& left, const Student& right) {
if(left.age < right.age)
return true; //左小返回真,则从小到大排序
else
return false;
}    
}

set<Student, CompStudent> s1;
Student stu1, stu2, stu3;
stu1.age = 28;
stu2.age = 19;
stu3.age = 20;

s1.insert(stu1); 
s1.insert(stu2); 
s1.insert(stu3); 
//注意此时的迭代器也要变
for(set<Student, CompStudent>::iterator it = s1.begin(); it != s1.end(); it++) {
cout << it->age << endl;
}

如果两个student的age一样,则在上面情形下,后插入的那个会被忽略掉,如何判断
插入是否成功?----> 看insert的返回值---->pair的应用
Student stu4;
stu4.age = 28;
pair<set<Student, CompStudent>::iterator, bool> pair1 = s1.insert(stu4);
if(pair1.second == false) {
cout<< "failed." << endl;
}

set查找:
set.find(elem); // 查找elem元素,返回指向该元素的迭代器
set.count(elem); //返回elem的个数,对set,要么0,要么1,对multiset可能大于1
set.lower_bound(elem); //返回第一个>=elem的元素的迭代器
set.upper_bound(elem); //返回第一个>elem的元素的迭代器
set.equal_range(elem); //返回容器中与elem相等的上下限两个迭代器,在pair的形式返回,
//上限闭区间,下限开区间[begin, end)
equal_range使用示例:
set<int> s1; 
s1.insert(10); 
s1.insert(30); 
s1.insert(20); 
s1.insert(40); 
pair<set<int>::iterator, set<int>::iterator> p = s1.equal_range(30);
set<int>::iterator it1 = p.first;
cout<<*it1<<endl; //因为是>= 应该是30
set<int>::iterator it2 = p.second;
cout<<*it2<<endl; //因为是> 应该是40

p = s1.equal_range(25);
it1 = p.first;
cout<<*it1<<endl; //因为是>= 应该是30
it2 = p.second;
cout<<*it2<<endl; //因为是> 应该是30

multiset基本操作:
因为允许重复元素,自动排序可能出现1,2,2,2,3这样的顺序,其他和set一样

这篇关于STL学习笔记-set/multiset容器(集合)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/808727

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

shell中set -u、set -x、set -e的使用

《shell中set-u、set-x、set-e的使用》本文主要介绍了shell中set-u、set-x、set-e的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录✅ 1. set -u:防止使用未定义变量 作用: 示例:❌ 报错示例输出:✅ 推荐使用场景:✅ 2. se

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

SpringIOC容器Bean初始化和销毁回调方式

《SpringIOC容器Bean初始化和销毁回调方式》:本文主要介绍SpringIOC容器Bean初始化和销毁回调方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录前言1.@Bean指定初始化和销毁方法2.实现接口3.使用jsR250总结前言Spring Bea