首页 > 编程语言 >C++ STL常用容器之set

C++ STL常用容器之set

时间:2024-11-03 15:49:26浏览次数:3  
标签:map set STL 元素 C++ 集合 multiset unordered

文章目录

一、集合set

set称为集合,是一个内部自动有序且不含重复元素的容器。set容器的特性,相比map没有value的值,只有key的元素在里面了,底层实现仍然是用红黑树实现的。

二、所需的头文件

#include <set>

三、基本访问操作

3.1 插入元素

set<类型> s;//定义方式 集合内的元素是不重复的 类似map中的key元素,但是没有对应的value
s.inert(1);//插入元素1

3.2 删除元素

删除元素的方法有三种

s.erase(it);//it为元素值为1的迭代器。
s.erase(1);//直接删除值为1的元素。
s.erase(first, last);//删除[first,last)内的所有元素其中first为起始元素的迭代器,last为删除区间的末尾迭代器的下一个。

3.3 查找元素

auto it=s.find(1);
printf("%d",*it);//1

3.4 其他函数

s.clear();//清空集合
s.size();//集合元素的个数
s.empty();//判断集合是否为空

四、无序集合unordered_set

unordered_set和set基本相同,也是不允许有重复元素。集合不会被排序,底层实现是哈希表(hash)存储结构。只是set内的元素是有序的,set自动排序。unordered_set是无序的,按插入元素先后顺序排列。且unordered_set没有rbegin和rend函数。

#include <unordered_set>//引入头文件
unordered_set<int>s1;

五、multiset

//multiset 集合数据可以重复
multiset ms {8, 7, 6, 5, 4, 3, 2, 1};
多表集合的结构与set 相似,底层原理一致,但是key的值如果有相同的数据,就会再用一个vector来进行存储。
多表集合可以允许有多个重复的键值。

六、unordered_multiset

无序多表集合
unordered_multiset ums;
特点:

  • 该容器底层是哈希表实现
  • 里面的key既不会去重,也不会排序
  • 用法与unordered_set类似
  • 虽然不会排序,但重复的数据也会排列在一起

七、使用set容器

//set 对应map 去重排序
set<int> s = { 2, 5, 4, 7, 9, 6, 4, 3, 5, 8, 0, 5, 34, 23 };
for (auto e : s)
{
cout << e << " ";
}
cout << endl;
//结果:0 2 3 4 5 6 7 8 9 23 34
//multiset 对应multimap 排序
multiset<int> ms = { 2, 5, 4, 7, 9, 6, 4, 3, 5, 8, 0, 5, 34, 23 };
for (auto e : ms)
{
cout << e << " ";
}
cout << endl;
//结果:0 2 3 4 4 5 5 5 6 7 8 9 23 34

八、map与set的区别

容器底层是否去重是否排序对应无值的容器
map红黑树set
multimap红黑树multiset
unordered_map哈希表unordered_set
unordered_multimap哈希表unordered_multiset

标签:map,set,STL,元素,C++,集合,multiset,unordered
From: https://blog.csdn.net/qq_49420679/article/details/143465205

相关文章

  • c++11(下篇)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、可变参数模板4.1基本语法及原理4.2包扩展4.3empalce系列接⼝二、lambda2.1.仿函数2.2.lambda表达式语法2.3.捕捉列表2.3lambda原理三.新的类功能3.1默认的移动构造和移动赋值3.2......
  • Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
    文章目录一、Redis数据结构概述1.1Redis有哪些数据类型1.2Redis本质是哈希表1.3Redis的哈希冲突与渐进式rehash1.4数据结构底层1.4.1简单动态字符串SDS1.4.2双向链表LinkedList(后续已废弃)1.4.3压缩列表ZipList1.4.4哈希表HashTable1.4.5跳表SkipList1.4.6......
  • 学生管理系统(C++)
    #include<iostream>#include<vector>#include<fstream>#include<string>#include<sstream>#include<algorithm>usingnamespacestd;structStudent{std::stringname;intid;intage;......
  • 【NOI】C++函数入门二(自定义函数)
    文章目录前言一、概念1.导入1.1首先什么是函数呢?2.函数分类3.为什么要定义函数呢?4.函数结构5.函数使用注意事项二、例题讲解问题:1137-纯粹素数问题:1258-求一个三位数问题:1140-亲密数对问题:1149-回文数个数三、总结四、感谢前言在这一章节中,我们将深入探......
  • C++学习笔记
    一、从C转向C++1.1、使用const和inline而不#define使用constconstintm=10;intn=m;上述代码在C中,编译器会先到m的内存中取出数据,再赋值给n;但在C++中,会直接将10赋值给n。C++的常量更类似于#define,是一个替换过程。#define经常不被认为是语言的一部分。define本......
  • comparing ECMA6 sets for equality
    题意:"比较ECMA6集合的相等性"问题背景:Howdoyoucomparetwojavascriptsets?Itriedusing == and === butbothreturnfalse."如何比较两个JavaScript集合?我尝试使用==和===,但两者都返回false。"a=newSet([1,2,3]);b=newSet([1,3,2]);a==b;......
  • 华为OD机试-E卷,100分 - 最小的调整次数特异性双端队列Java & Python& JS & C++ & C
    最新华为OD机试题目描述有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据。现在要求移除数据的顺......
  • 华为OD机试-E卷100分 -货币单位换算Java & Python& JS & C++ & C
    最新华为OD机试题目描述记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分,或者元与分的组合。要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃......
  • 【STL_list 模拟】——打造属于自己的高效链表容器
    一、list节点​list是一个双向循环带头的链表,所以链表节点结构如下: template<classT> structListNode { Tval; ListNode*next; ListNode*prve; ListNode(intx) { val=x; next=prve=this; } };二、list迭代器2.1、list迭代器与vector......
  • C++中的内联函数:深入解析与应用
    C++中的内联函数:深入解析与应用在C++编程中,内联函数(InlineFunction)是一种优化手段,旨在通过在编译时将函数调用替换为函数体本身,以减少函数调用的开销,从而提高程序的执行效率。内联函数的使用需要谨慎,因为它虽然能带来性能上的提升,但也可能导致代码膨胀和编译时间增加。本......