您现在的位置是:首页 > 技术文章网站首页技术文章

[STL]认识set

  • WangYe
  • 2020-08-02 20:58:52
  • 508 次阅读
了解stl中的set

set(集合)由红黑树实现,其内部元素依据其值自动排序,每个元素值只能出现一次,不允许重复;


特点:

    1. set中的元素都是排好序的,集合中没有重复的元素;

    2. map和set的插入删除效率比用其它序列容器高,因为对于关联容器来说,不需要做内存拷贝和内存移动;


优缺点和使用场景:

    优点:使用平衡二叉树实现,便于元素查找,且保持了元素的唯一性,以及能自动排序;

    缺点:每次插入值的时候,都需要调整红黑树,效率有一定影响;

    适用场景:适用于经常查找一个元素是否在某群集中且需要排序的场景;


基本操作:

s.begin()       //  返回指向第一个元素的迭代器
s.clear()       //  清除所有元素
s.count()       //  返回某个值元素的个数
s.empty()       //  如果集合为空,返回true(真)
s.end()         //  返回指向最后一个元素之后的迭代器,不是最后一个元素
s.equal_range() //  返回集合中与给定值相等的上下限的两个迭代器
s.erase()       //  删除集合中的元素
s.find()        //  返回一个指向被查找到元素的迭代器
s.get_allocator()   //  返回集合的分配器
s.insert()      //  在集合中插入元素
s.lower_bound() //  返回指向大于(或等于)某值的第一个元素的迭代器
s.key_comp()    //  返回一个用于元素间值比较的函数
s.max_size()    //  返回集合能容纳的元素的最大限值
s.rbegin()      //  返回指向集合中最后一个元素的反向迭代器
s.rend()        //  返回指向集合中第一个元素的反向迭代器
s.size()        //  集合中元素的数目
s.swap()        //  交换两个集合变量
s.upper_bound() //  返回大于某个值元素的迭代器
s.value_comp()  //  返回一个用于比较元素间的值的函数


创建set集合对象

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


元素插入:

    s.insert(1);
    s.insert(2);
    s.insert(3);

元素遍历:

#include<iostream>
#include<set>
using namespace std;
set<int>s;
int main()
{
    s.insert(1);
    s.insert(2);
    s.insert(3);
    set<int>::iterator it;
    for(it=s.begin();it!=s.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
}

元素查找:

#include<set>
using namespace std;
set<int>s;
int main()
{
    s.insert(1);
    s.insert(2);
    s.insert(3);
    if(s.find(3)!=s.end())
    cout<<"Yes"<<endl;
    else
    cout<<"No"<<endl;
    if(s.count(3))
    cout<<"Yes"<<endl;
    else
    cout<<"No"<<endl;
}

输出结果:

图片.png

find()查找元素返回给定值的迭代器,如果没找到则返回 end();

count() 用来查找 set 中某个某个键值出现的次数。这个函数在 set 并不是很实用,因为一个键值在 set 只可能出现 0 或 1 次,这样就变成了判断某一键值是否在 set 出现过了


删除元素,容器中元素个数/清空容器,判空:

#include<iostream>
#include<set>
using namespace std;
set<int>s;
int main()
{
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.erase(3);//删除元素
    cout<<s.size()<<endl;//容器中元素的个数
    s.clear();//清空容器
    if(s.empty())//判空,集合为空,返回true(真) 
    cout<<"Yes"<<endl;
    else
    cout<<"No"<<endl;
}


实例:

下面的例子演示 set(集合)的两个特点:

#include <iostream>
#include <set>

using namespace std;

int main(int argc,char* argv[])
{
    set<int> setTemp;
    
    setTemp.insert(3);
    setTemp.insert(1);
    setTemp.insert(2);
    setTemp.insert(1);
    
    set<int>::iterator it;
    for(it = setTemp.begin();it != setTemp.end();it++)
    {
        cout << *it << "";
    }
    cout << endl;
    
    return 0;
}

输出结果:1 2 3。一共插入了 4 个数,但是集合中只有 3 个数并且是有序的,可见之前说过的 set 集合的两个特点,有序和不重复;


当 set 集合中的元素为结构体时,该结构体必须实现运算符 ‘<’ 的重载:

#include <iostream>
#include <set>
#include <string>

using namespace std;

struct People
{
    string name;
    int age;
    
    bool operator < (const People p) const
    {
        return age < p.age;
    }
};
int main(int argc,char* argv[])
{
    set<People> setTemp;
    
    setTemp.insert({"张三",14});
    setTemp.insert({"李四",16});
    setTemp.insert({"隔壁老王",10});
    
    set<People>::iterator it;
    for(it = setTemp.begin();it != setTemp.end();it++)
    {
        printf("姓名:%s 年龄:%d \n",(*it).name.c_str(),(*it).age);
    }
    cout << endl;
    
    return 0;
}

输出结果:

    姓名:隔壁老王 年龄:10

    姓名:张三 年龄:14

    姓名:李四 年龄:16


可以看到结果是按照年龄由小到大的顺序排列。另外 string 要使用c_str()转换一下,否则打印出的是乱码;

另外 Multiset 和 set 相同,只不过它允许重复元素,也就是说 multiset 可包括多个数值相同的元素。这里不再做过多介绍;

TAG: STL set

上一篇:[STL]认识list

下一篇:[C++]动态内存

文章评论 (0)



Top