STL(六)(set篇)
2023-12-13 04:08:02
1.set集合
- set是一种容器,用于存储一组唯一的元素,并按照一定的排序规则进行排序,set中的元素是按照升序排序的,默认情况下,它使用元素的比较运算符(<)来进行排序
set的定义和结构如下:
template <class Key,class Compare=less<Key>,
class Allocator=allocator<Key>>
class set;
- Key:表示存储在set中的元素的类型
- Compare:表示元素之间的比较函数对象的类型,默认为less,即按照元素的值进行比较
- Allocator:表示用于分配内存的分配器类型,默认为allocator
- set的内部实现使用了红黑树(一种自平衡的二叉搜索树)来存储元素,并保持元素的有序性
- 这使得在set中插入,删除和查找元素的时间复杂度都是对数时间,即O(logn)
- set中的元素是唯一的,即不允许重复的元素存在,当插入一个重复的元素时,set会自动忽略该元素
?
- ?修改set的常见手段:
1.
#include<bits/stdc++.h>
using namespace std;
int main(){
set<int,greater<int>>mySet;
mySet.insert(89);
mySet.insert(67);
mySet.insert(39);
mySet.insert(92);
for(const auto& elem:mySet){
cout<<elem<<" ";
}
cout<<"\n";
return 0;
}
2.
#include<bits/stdc++.h>
using namespace std;
struct MyCompare{
bool operator()(const int&a,const int&b){
//自定义比较逻辑
return a>b; //改为逆序
}
};
int main(){
set<int,MyCompare>mySet;
mySet.insert(89);
mySet.insert(67);
mySet.insert(39);
mySet.insert(92);
for(const auto&elem:mySet){
cout<<elem<<" ";
}
cout<<"\n";
return 0;
}
?2.multiset多重集合
- multiset是一种容器,它与set类似,用于存储一组元素,并按照一定的排序规则进行排序不同之处在于,multiset容器允许存储重复的元素
multiset的定义和结构与set类似,如下所示:
template <class Key,class Compare=less<Key>
class Allocator=allocator<Key>>
class multiset;
- Key:表示存储在multiset中的元素的类型
- Compare:表示元素之间的比较函数对象的类型,默认为less,即按照元素的值进行比较
- Allocator:表示用于分配内存的分配器类型,默认为allocator
- multiset的内部实现也使用红黑树来存储元素,并保持元素的有序性,与set不同的是,multiset中的元素可以重复出现
?
3.unordered_ set无序集合
- unordered_set是一种容器,用于存储一组唯一的元素,并且没有特定的顺序
- unordered set容器使用哈希表来实现元素的存储和访问,因此元素的插入,删除和查找的时间复杂度都是常数时间,即0(1)
unordered_set的定义和结构如下:
template <class Key,class Hash=hash<Key>,
class KeyEqual=equal_to<key>,
class Allocator=allocator<Key>>
class unordered_set;
- Key:表示存储在unordered set中的元素的类型。
- Hash:表示用于计算元素哈希值的哈希函数对象的类型,默认为hash,使用Key类型的默认哈希函数。
- KeyEqual:表示用于比较元素是否相等的函数对象的类型,默认为equal to,使用Key类型的默认相等比较函数
- Allocator:表示用于分配内存的分配器类型,默认为allocator
- unordered_set中的元素是唯一的,即不允许重复的元素存在,当插入一个重复的元素时,unordered_set会自动忽略该元素
- 这些时间复杂度是基于哈希函数的性能和哈希冲突的情况来计算的
- 平均情况下,unordered_set的插入,查找和移除操作都具有常数时间复杂度0(1),然而,在最坏情况下这些操作的时间复杂度可能为0(n),其中n是无序集合中的元素数量
- 最坏情况通常发生在哈希冲突较为严重的情况下,导致需要线性探测或链式解决冲突,从而影响性能,所以我们一般情况下不会使用unordered_set,而选择使用复杂度更稳定的set?
4.代码示例:
?
#include<bits/stdc++.h>
using namespace std;
int main(){
set<int>mySet;
//插入元素
mySet.insert(5);
mySet.insert(2);
mySet.insert(8);
mySet.insert(2); //重复元素
//遍历集合
cout<<"Set elements:";
for(const auto&elem:mySet){
cout<<elem<<" ";
}
cout<<"\n";
//查找元素
int searchValue=5;
auto it=mySet.find(searchValue);
if(it!=mySet.end()){
cout<<searchValue<<"found in the set."<<"\n";
}
else{
cout<<searchValue<<"not found in the set."<<"\n";
}
//移除元素
int removeValue=2;
mySet.erase(removeValue);
//再次遍历集合
cout<<"Set elements sfter removel:";
for(const auto& elem:mySet){
cout<<elem<<" ";
}
cout<<"\n";
//清空集合
mySet.clear();
//检查集合是否为空
if(mySet.empty()){
cout<<"Set is empty."<<"\n";
}
else{
cout<<"Set is not empty."<<"\n";
}
return 0;
}
输出:
?
文章来源:https://blog.csdn.net/weixin_41576682/article/details/134849527
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!