set学习(系统的学习)

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

下面介绍set的常用操作:

1:注意包含头文件<set>

set只有自加和自减运算!!!

s.begin()    返回set容器的第一个元素的地址

s.end()    返回set容器的最后一个元素之后的地址

s.clear()   删除set容器中的所有的元素

s.empty()    判断set容器是否为空

s.insert()   插入一个元素

s.erase()   删除一个元素

s.size()      返回当前set容器中的元素个数

具体看代码:

#include<iostream>
#include<set>
using namespace std;
int main()
{
    set<int> s;//创建一个set对象
    for(int i=0;i<3;i++)
        s.insert(i+10);//插入三个元素,10 11 12
    cout<<*s.begin()<<endl;//输出第一个元素10
    cout<<*(--s.end())<<endl;//输出最后一个元素
    s.erase(s.begin());//删除第一个元素
    cout<<*s.begin()<<endl;//第一个元素变为11
    cout<<s.size()<<endl;//答案为2
    s.clear();//清空所有元素
    cout<<s.size()<<endl;//输出为0
    return 0;
}

迭代器的使用:

#include<iostream>
#include<set>
using namespace std;
int main()
{
    set<int> s;//创建一个set对象
    for(int i=0;i<3;i++)
        s.insert(i+10);//插入三个元素,10 11 12
    set<int>::iterator it;//创建一个迭代器
    for(it=s.begin();it!=s.end();it++)//用迭代器进行遍历
        cout<<*it<<" ";
    cout<<endl;
    it=s.begin();
    it++;
    s.erase(it);//用迭代器进行删除操作
    for(it=s.begin();it!=s.end();it++)//用迭代器进行遍历
        cout<<*it<<" ";
    cout<<endl;
    return 0;
}

修改:不能修改容器内数据,所以只能删除某元素再插入要修改的数值

查找:s.find()

如果容器内不存在该元素,返回值等于s.end();

#include<iostream>
#include<set>
using namespace std;
int main()
{
    set<int> s;//创建一个set对象
    for(int i=0;i<3;i++)
        s.insert(i+10);//插入三个元素,10 11 12
    set<int>::iterator it;//创建一个迭代器
    for(it=s.begin();it!=s.end();it++)//用迭代器进行遍历
        cout<<*it<<" ";
    cout<<endl;
    if(s.find(10)!=s.end()) cout<<"yes"<<endl;
    return 0;
}

set的其它常用操作:

s.lower_bound() 返回第一个大于或等于给定关键值的元素

s.upper_bound() 返回第一个大于给定关键值的元素

s.equal_range() 返回一对定位器,分别表示 第一个大于或等于给定关键值的元素 和 第一个大于给定关键值
的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于
s.end()

#include<iostream>
#include<set>
using namespace std;
int main()
{
    set<int> s;//创建一个set对象
    for(int i=0;i<3;i++)
        s.insert(i+10);//插入三个元素,10 11 12
    cout<<*s.lower_bound(10)<<endl;//输出10
    cout<<*s.upper_bound(10)<<endl;//输出11
    cout<<*s.equal_range(10).first<<endl;//10
    cout<<*s.equal_range(10).second<<endl;//11
    return 0;
}

如果要把set定义为降序:可以如下定义:

#include<iostream>
#include<set>
using namespace std;
int main()
{
    set<int,greater<int> >s;
    for(int i=0;i<3;i++)
        s.insert(i+10);
    set<int>::iterator it;
    //降序输出
    for(it=s.begin();it!=s.end();it++) cout<<*it<<endl;
    return 0;
}

 

posted @ 2018-11-05 19:35  执||念  阅读(345)  评论(0编辑  收藏  举报