欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL模板库的学习之集合(set)

程序员文章站 2022-04-15 14:37:30
...

set,顾名思义,就是数学上的集合——每个元素最多只出现一次,并且set中的元素已经从小到大排好序。
头文件:#include<set>


1.常用的函数

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

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

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

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

max_size()   返回set容器可能包含的元素最大个数

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

erase(it) 删除迭代器指针it处元素

还有两个功能类似的函数:count()和find()

(1). count() :用来查找set中某个元素出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
(2).find(): 用来查找set中某个元素出现的位置。如果找到,就返回这个元素的迭代器,如果这个元素不存在,则返回 s.end()。 (最后一个元素的下一个位置,s为set的变量名)


2.集合:set(参考博客,讲述得非常清晰全面,注意博客中的“4.”有点错误,自行改正)/以下内容就没必要看了,均是我在理解博客时,所敲的代码。以下内容,链接博客中均有所涉及/


3.元素的顺序插入与遍历
STL模板库的学习之集合(set)

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

/*set集合的性质:1.有序性,集合中的元素是按从小到大的顺序排列的;
                 2.互异性;*/

int main()
{
    set<int>s;
    s.insert(5);
    s.insert(2);
    s.insert(8);
    s.insert(12);
    s.insert(5);
    set<int>::iterator it;//设置集合的前向迭代器
    for(it=s.begin();it!=s.end();it++)//遍历集合,s.end()指代的是最后一元素的下一位置
    /*当begin()和end()相等时,迭代器的范围为空;当两个不等时,迭代器范围内至少有一个元素,而begin()指向该区间中的第一个元素*/
    {
        cout<<*it<<" ";
    }
    cout<<endl;
    return 0;
}

4.元素的逆序遍历与删除
STL模板库的学习之集合(set)

#include <iostream>
#include <set>

using namespace std;
int main()
{
    set<int>s;
    s.insert(5);
    s.insert(4);
    s.insert(2);
    s.erase(5);
    s.insert(5);
    s.insert(9);
    set<int>::reverse_iterator rit;
    for(rit=s.rbegin();rit!=s.rend();rit++)
    {
        cout<<*rit<<" ";
    }
    cout<<endl;
    set<int>::iterator it;
    it=s.begin();
    for(int i=0;i<2;i++)//集合按从小到大排列,删除前两个元素
    {
        s.erase(it++);
    }
    for(it=s.begin();it!=s.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    cout<<"len="<<s.size()<<endl;

    return 0;
}

5.元素的检索(两种方式:用find()或count())
使用find()方法对集合进行检索,如果找到查找的的键值,则返回该键值的迭代器位置;否则,返回集合最后一个元素后面的一个位置,即end()。
STL模板库的学习之集合(set)

#include <iostream>
#include <set>

using namespace std;
int main()
{
    set<int>s;
    s.insert(5);
    s.insert(4);
    s.insert(2);
    s.erase(5);
    s.insert(5);
    s.insert(9);
    set<int>::iterator it;
    for(it=s.begin();it!=s.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    it=s.find(4);/*注意这里的地址用迭代器来存储,用int *来存储不合适*/
    if(it!=s.end())
        cout<<*it<<endl;
    else
        cout<<"not find it"<<endl;
    it=s.find(1);
    if(it!=s.end())
        cout<<*it<<" ";
    else
        cout<<"not find it"<<endl;
    for(int i=0;i<2;i++)
    {
        s.erase(it++);
    }

    cout<<"len="<<s.size()<<endl;
    return 0;
}

6.自定义比较函数(见链接博客)?????(这部分有困惑)


最后,不得不提的就是结构体类型(struct )的set ,使用时必须要重载 ‘<’ 运算符

#include<iostream>
#include<set>
#include<string>
using namespace std;
struct Info
{
    string name;
    double score;
    bool operator < (const Info &a) const // 重载“<”操作符,自定义排序规则
    {
        //按score由大到小排序。如果要由小到大排序,使用“>”即可。
        return a.score < score;
    }
};
int main()
{
    set<Info> s;
    Info info;

    //插入三个元素
    info.name = "Jack";
    info.score = 80;
    s.insert(info);
    info.name = "Tom";
    info.score = 99;
    s.insert(info);
    info.name = "Steaven";
    info.score = 60;
    s.insert(info);

    set<Info>::iterator it;
    for(it = s.begin(); it != s.end(); it++)
        cout << (*it).name << " : " << (*it).score << endl; 
    return 0;
}
/*
运行结果:
Tom : 99
Jack : 80
Steaven : 60
*/

还可参考自创群里的《STL标准模板库文档》。

相关标签: set

上一篇: Set实现类性能对比

下一篇: Set集合