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

相关文章

如何将Tomcat容器替换为Jetty容器

《如何将Tomcat容器替换为Jetty容器》:本文主要介绍如何将Tomcat容器替换为Jetty容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat容器替换为Jetty容器修改Maven依赖配置文件调整(可选)重新构建和运行总结Tomcat容器替

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.