c++ STL set集合中包含的函数及其应用(一)

本文深入探讨了C++ STL中的set和multiset容器,解析了它们的底层实现原理,红黑树,并详细介绍了如何创建、遍历、查询和删除元素。同时,文章提供了丰富的代码示例,展示了set和multiset的常用函数及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. set简介:
    set是STL中一种标准关联容器,它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset元素。

  2. set常用函数
    (1)三种形成集合的方法:

#include<iostream>
#include<set>
using namespace std;
void print(multiset<int>& s){
    multiset<int>::iterator it=s.begin();
    while(it!=s.end()){cout<<*it<<" ";it++;}
    cout<<endl;
} 
int main(){
    int a[]={5,3,9,3,7,2,9,3};
    multiset<int>s1;
    //通过构造函数insert()添加集合。 
    for(int i=0;i<sizeof(a)/sizeof(int);i++)s1.insert(a[i]);
    print(s1);
    //通过复制构造函数set(const set& x)创建集合 
    multiset<int>s2(s1);print(s2);
    //通过构造函数set(conset value_type*first,const value_type* last)创建集合
    multiset<int>s3(a,a+sizeof(a)/sizeof(int));print(s3); 
}

输出展示:
这里写图片描述
(2)set常用的函数:

(话不多说直接上代码)

#include<iostream>
#include<set>
using namespace std;
void print(set<int>&s){
    set<int>::iterator it=s.begin();
    while(it!=s.end()){cout<<*it<<" ";it++;}
    cout<<endl;
}
int main(){
    int a[]={3,2,9,4,5};
    set<int>s(a,a+sizeof(a)/sizeof(int));
    //反向遍历 
    set<int>::reverse_iterator it=s.rbegin();
    while(it!=s.rend()){cout<<*it<<" ";it++;}cout<<endl; 
    //判断集合是否为空
    if(s.empty())puts("集合为空");else puts("集合不为空");
    //计算集合的大小
    cout<<s.size()<<endl;
    //一个集合中x值出现的次数
    cout<<s.count(2)<<endl;
    //元素检索
    set<int>::iterator te=s.find(5);
    if(te==s.end())puts("没找到");
    else puts("找到了");
    set<int>::iterator iii=s.lower_bound(3);
    cout<<*iii<<endl;
    set<int>::iterator ttt=s.upper_bound(2);
    cout<<*ttt<<endl;
    //删除元素
    set<int>::iterator itt=s.find(2);
    s.erase(itt); print(s);//删除迭代指针itt处的元素
    s.erase(5);print(s);//删除元素值等于key的元素.

} 

(3)equal_range,pair,count,size用法举例:

#include<iostream>
#include<set>
using namespace std;
int main(){
    int a[]={5,3,9,3,7,2,9,3};
    set<int>myset(a,a+sizeof(a)/sizeof(int));
    multiset<int>mymultiset(a,a+sizeof(a)/sizeof(int));

    pair<set<int>::iterator,set<int>::iterator>s1;
    pair<multiset<int>::iterator,multiset<int>::iterator>s2;

    s1=myset.equal_range(3);
    s2=mymultiset.equal_range(3);

    int ncount=myset.count(3);
    int nMulticount=mymultiset.count(3);

    set<int>::iterator te;
    cout<<"set(搜索值等于3的元素):"<<endl;
    for(te=s1.first;te!=s1.second;te++)cout<<*te<<" ";cout<<endl;
    cout<<"个数是:"<<ncount<<endl;
    cout<<"总个数是:"<<myset.size()<<endl;

    multiset<int>::iterator it;
    cout<<"multiset(搜索值等于3的元素):"<<endl;
    for(it=s2.first;it!=s2.second;it++)cout<<*it<<" ";cout<<endl;
    cout<<"个数是:"<<nMulticount<<endl;
    cout<<"总个数是:"<<mymultiset.size()<<endl;
}

结果展示:
这里写图片描述
未完待续……..

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值