STL的set知识点大全

1.se't/multiset容器简介

set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
◎ set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。
set不可以直接存取元素。(不可以使用at.(pos)与操作符)。


◎ multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素

2.se't容器的查找
◎ set.find(elem); //查找elem元素,返回指向elem元素的迭代器。

◎ set.count(elem); //返回容器中值为elem的元素个数。对set来说,要么是0,要么是1。对multiset来说值可能大于1。


◎ set.lower bound(elem); //返回第一个>=elem元素的迭代器

◎ set.upper bound(elem); // 返回第一个>elem元素的迭代器。

代码示例:



#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    set<int>s1;//set容器默认是升序排序
    s1.insert(3);
    s1.insert(2);
    s1.insert(6);
    s1.insert(9);
    s1.insert(1);
    s1.insert(1);
    set<int>::iterator it;
    for(it=s1.begin();it!=s1.end();it++)
        cout<<*it<<" ";//1 2 3 6 9
    cout<<endl;

    set<int>::reverse_iterator it2;
    for(it2=s1.rbegin();it2!=s1.rend();it2++)
        cout<<*it2<<" ";//9 6 3 2 1
    cout<<endl;

    set<int>s2(s1);//调用拷贝构造函数
    set<int>s3;//调用默认构造函数

    s3=s2;
    for(it=s3.begin();it!=s3.end();it++)
        cout<<*it<<" ";//1 2 3 6 9
    cout<<endl;

    s3.insert(10);
    s3.swap(s1);
    for(it=s3.begin();it!=s3.end();it++)
        cout<<*it<<" ";//1 2 3 6 9
    cout<<endl;

    for(it=s1.begin();it!=s1.end();it++)
        cout<<*it<<" ";//1 2 3 6 9 10
    cout<<endl;

    //将set容器中的最小值删掉
    it=s3.begin();
    s3.erase(it);
    for(it=s3.begin();it!=s3.end();it++)
        cout<<*it<<" ";//2 3 6 9
    cout<<endl;

    //将set容器中的最大值删掉
    it=s3.end();
    it--;
    s3.erase(it);
    for(it=s3.begin();it!=s3.end();it++)
        cout<<*it<<" ";//2 3 6
    cout<<endl;

#if 0
    //set容器不支持使用反向迭代器对元素进行删除
    set<int>;;reverse_iterator it3=s3.rebegin();
    s3.erase(it3);
#endif

    //删除指定的值`
    cout<<s3.erase(3)<<endl;// 1(true)
    s3.erase(3);
    for(it=s3.begin();it!=s3.end();it++)
        cout<<*it<<" ";//2 6
    cout<<endl;

    //如果需要删除的元素不在set中,erase函数如果需要删除的元素在set中放回true,否则返回false
    cout<<s3.erase(100)<<endl;// 0(false)
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    set<int,less<int>>s1;//升序排列
    set<int,greater<int>>s2;//降序排列

    s1.insert(1);
    s1.insert(5);
    s1.insert(3);

    s2.insert(1);
    s2.insert(5);
    s2.insert(3);

    set<int>::iterator it;
    it=s1.find(3);//找3
    cout<<*it<<endl;//3

    //如果找不到指定元素,返回end()
    it=s1.find(10);
    if(it==s1.end())
        cout<<"can not find elem";//can not find elem
    else
        cout<<*it<<endl;
    cout<<endl;

    cout<<s1.count(1)<<endl;//1
    cout<<s1.count(10)<<endl;//0

    //查找第一个>=6的元素
    s1.insert(6);
    s1.insert(8);
    s1.insert(7);
    s1.insert(10);
    it=s1.lower_bound(6);
    cout<<">=6:"<< *it<<endl;//6

    //查找一个>6的元素
    it=s1.upper_bound(6);
    cout<<">6:"<< *it<<endl;//7

#if 0
    cout<<"s1:";
    for(it=s1.begin();it!=s1.end();it++)
        cout<<*it<<" ";//1 3 5 6 7 8 10
    cout<<endl;

    cout<<"s2:";
    for(it=s2.begin();it!=s2.end();it++)
        cout<<*it<<" ";//5 3 1
#endif



    return 0;
}

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值