set的常见用法详解

set译为集合,是一个内部自动有序且不含重复元素的容器

有时出现需要去掉重复元素的情况

而且有可能因这些元素比较大或者类型不是int型而不能直接开散列表

在这种情况下就可以用set来保留元素本身而不考虑它的个数

当然

上面的情况也可以再开一个数组进行下标和元素的对应来解决

但是set提供了更为直观的接口

并且加入set之后可以实现自动排序

头文件#include

using namespace std;

1、set的定义

setname;

与vector相同,大部分STL都是这样的

2、set容器的访问

只能通过迭代器访问

set::iterator it;

可以通过*it来访问set里的元素

除开vector和string之外的STL容器都不支持*(it+i)的访问方式

只能按以下方式进行枚举

#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
    set st;
    st.insert(3);
    st.insert(5);
    st.insert(2);
    st.insert(3);
    for(set::iterator it=st.begin();it!=st.end();it++)
    {
        printf("%d",*it);
    }
    return 0;
}

不支持it

可以发现,set内的元素自动递增排序,且自动去除了重复元素

3、set常用函数

(1)insert()

insert(x)可将x插入set容器中,并自动递增排序和去重

(2)find()

find(value)返回set中对应值为value的迭代器

#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
   set st;
   for(int i=1;i<=3;i++)
   {
     st.insert(i);  
   }
   set::iterator it=find(2);
   printf("%d\n",*it);
    return 0;
}

(3)erase()

①删除单个元素

st.erase(st.find(100));

st.erase(value)

value就是所需要删除的值

②删除一个区间内的所有元素

st.erase(first,last)可以删除一个区间内的所有元素

其中first为所需要删除区间的起始迭代器,而last则为所需要删除区间的末尾迭代器的下一个地址

[first,last)

set::iterator it=st.find(30);

st.erase(it,st.end());

删除元素30至set末尾之间的元素

(4)size()

用来获取set内元素的个数

(5)clear()

用来清空set中的所有元素

4、set的常见用途

set最主要的作用是自动去重并按升序排序,因此碰到需要去重但是不方便直接开数组的情况,可以尝试用set

延伸:

set中元素是唯一的,如果需要处理不唯一的情况

则需要使用multiset

C++11标准中还增加了unordered_set

以散列代替set内部的红黑树

(一种自平衡二叉查找树)

使其可以用来处理只去重但不排序的需求

速度比set快很多

知识点来自于《算法笔记》

你可能感兴趣的:(知识回顾,STL)