当前位置 博文首页 > lilian的博客:STL之set常见用法详解

    lilian的博客:STL之set常见用法详解

    作者:[db:作者] 时间:2021-09-17 12:23

    摘自胡凡的《算法笔记》,仅作记录用!
    前言:
    set是一个内部自动有序不含重复元素的容器。
    如果要使用set,需要添加set头文件,即#include<set>,除此之外,还需要添加using namespace std;

    一、set的定义

    1. 单独定义一个set,可以使用set<typename> name;其实类似于vector的定义
    • 这里的typename可以是任何基本类型,如int,double,char,结构体等,也可以是STL标准容器,如vector,set,queue等
    • 值得注意的是,如果typename也是一个STL容器,定义的时候要记得在>>符号之间加上空格,因为一些使用C++11之前标准的编译器会把它视为移位操作,导致编译错误。
    1. set数组的定义
    • set<typename> Arrayname[arraySize];,这样Arrayname[0]~Arrayname[arraySize-1]中每一个都是一个set容器

    二、set容器内元素的访问

    • set只能通过迭代器访问
    • set<typename>::iterator it;定义迭代器,得到了迭代器it之后,可以通过*it来访问set中的元素
    • set并不支持*(it+i)的访问方式。
    • set内的元素自动递增排序,且自动去除了重复元素。

    三、set常用函数

    1. insert(),时间复杂度为 O ( N ) O\left(N\right) O(N)
    • insert(x)可以将x插入set容器中,并自动递增排序和去重。
    1. find(),时间复杂度为 O ( N ) O\left(N\right) O(N)
    • find(value)返回set中对应值为value的迭代器
    1. erase()有两种用法
    • 删除单个元素有两种方法:一是st.erase(it),it为所需要删除元素的迭代器。可以结合find()函数来使用。时间复杂度为 O ( 1 ) O\left(1\right) O(1)。二是st.erase(value),value为所需要删除元素的值,时间复杂度为 O ( N ) O\left(N\right) O(N)
    • st.erase(first,last)可以删除一个区间内的所有元素,其中first为所需要删除区间的其实迭代器,而last为所需要删除区间的末尾迭代器的下一个地址,也即为删除[first,last)。时间复杂度为 O ( l a s t ? f i r s t ) O\left(last-first\right) O(last?first)
    1. size()用来获得set内元素的个数,时间复杂度为 O ( 1 ) O\left(1\right) O(1)
    2. clear()用来清空set中的所有元素,时间复杂度为 O ( 1 ) O\left(1\right) O(1)

    四、set的常见用途

    • set最主要的作用就是自动去重并按升序排序,因此碰到需要去重却不方便开数组的情况,可以尝试用set。
    • set中元素是唯一的,如果需要处理不唯一的情况,则需要使用multiset。另外,C++11标准中还增加了unordered_set,以散列代替set内部的红黑树(一种自平衡二叉树),使其可以用来处理只去重但并不排序的需求,速度比set要快。
    cs
    下一篇:没有了