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学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

如何将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