C++学习->set容器(STL)

7 篇文章 0 订阅
2 篇文章 0 订阅

一、关于set

set是C++标准库中的一种关联容器。所谓关联容器就是通过键(key)来读取和修改元素。与map关联容器不同,它只是单纯键的集合。set容器的每一个键只能对应一个元素,即不存在键相同的不同元素。与map容器不同,set容器不支持下标操作访问元素。

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

二、set中的常用成员函数

s.begin() –返回指向第一个元素的迭代器

s.clear() –清除所有元素

s.count(value) –返回某个值元素的个数

s.empty() –如果集合为空,返回true

s.end() –返回指向最后一个元素的迭代器

s.equal_range(value )–返回集合中与给定值相等的上下限的两个迭代器

s.erase(value) –删除集合中的元素

s.find(value) –返回一个指向被查找到元素的迭代器

s.get_allocator() –返回集合的分配器

s.insert(value) –在集合中插入元素

s.erase() – 删除一个元素

s.lower_bound(value) –返回指向大于(或等于)某值的第一个元素的迭代器

s.key_comp() –返回一个用于元素键值比较的函数

s.max_size() –返回集合能容纳的元素的最大限值

s.rbegin() –返回指向集合中最后一个元素的反向迭代器

s.rend() –返回指向集合中第一个元素的反向迭代器

s.size() –集合中元素的数目

s.swap(int a,int b) –交换两个集合变量

s.upper_bound(value) –返回大于某个值元素的迭代器

s.value_comp() –返回一个用于比较元素间的值的函数

三、代码实现

#include<iostream>
#include<set>
using namespace std;

int main(){
    //创建set容器集合 
    set<int>s;
    multiset<int>ms;
    int n,tmp;
    scanf("%d",&n);
    //插入数据元素 
    for(int i=0;i<n;i++){
        scanf("%d",&tmp);
        s.insert(tmp);
        ms.insert(tmp);
    }
    //迭代输出容器元素 
    set<int>::iterator it1;
    multiset<int>::iterator it2;
    cout<<"s: "; 
    for(it1=s.begin();it1!=s.end();it1++){
        cout<<*it1<<" ";
    }
    cout<<endl;
    cout<<"ms: ";
    for(it2=ms.begin();it2!=ms.end();it2++){
        cout<<*it2<<" ";
    }
    cout<<endl;
    //查找
    s.lower_bound(5);
    s.upper_bound(5);
    ms.lower_bound(5);
    ms.upper_bound(5);
    int cnt=s.count(5);
    it1=s.find(5); 
    cout<<"cnt= "<<cnt<<endl;
    cout<<"it1= "<< *it1 <<endl;
    //删除
    s.erase(5);
    ms.erase(5);
    //输出 
    cout<<"s: ";
    for(it1=s.begin();it1!=s.end();it1++){
        cout<<*it1<<" ";
    }
    cout<<endl;
    cout<<"ms: ";
    for(it2=ms.begin();it2!=ms.end();it2++){
        cout<<*it2<<" ";
    }
    cout<<endl;
    //清空
    s.clear();
    ms.clear();
    return 0;
}

//结果:
//5
//11 5 5 6 2
//s: 2 5 6 11
//ms: 2 5 5 6 11
//cnt= 1
//it1= 5
//s: 2 6 11
//ms: 2 6 11 

四、set中的特殊函数

1.count函数和find函数

s.count(value)–返回某个值元素的个数
s.find(value)–返回一个指向被查找到元素的迭代器
若使用count()和find()函数查询同一元素5,count()函数返回的是该元素在set容器中的数量,find()函数则返回指向该元素的迭代器。需要注意的是,虽然使用find()函数可以返回指向该元素的迭代器,但只能对其做读操作,任何试图修改键值的操作都是非法的。

2.lower_bound函数和upper_bound函数

s.lower_bound(value)–返回指向大于(或等于)某值的第一个元素的迭代器
s.upper_bound(value)–返回大于某个值元素的迭代器

3..equal_range函数

s.equal_range(value )–返回集合中与给定值相等的上下限的两个迭代器
返回一对定位器,分别表示第一个大于或等于给定关键值的元素和 第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值