zoukankan      html  css  js  c++  java
  • 算法笔记--标准模板库STL--set

    set的常见用法详解

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

    头文件

    #include<set>
    using namespace std;
    

    set的定义

    单个set

    set<typename> name;
    
    set<int> name;
    set<double> name;
    set<char> name;
    set<node> name;	// node是结构体的类型
    

    set数组

    set<typename> ArrayName[arraySize];
    set<int> a[1000];
    

    set容器内元素访问

    只能通过迭代器访问

    set<typename>::iterator it;
    

    除了vector和string之外的STL容器都不能使用*(it + i) 的访问方式,所以只能枚举:

    #include<cstdio>
    #include<set>
    using namespace std;
    
    int main(){
        set<int> st;
        st.insert(3);
        st.insert(5);
        st.insert(2);
        st.insert(3);
    
        // 注意:不支持it < st.end()写法
        for(set<int>::iterator it = st.begin(); it != st.end(); it++){
            printf("%d ", *it);
        }
    
        return 0;
    }
    
    2 3 5
    

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

    set常用函数

    insert( )

    insert(x) 可将x插入set容器中,并且自动递增排序和去重,时间复杂度为O(logN) , N为set内元素的个数

    find( )

    find(value) 返回set中对应值为value的迭代器,时间复杂度为O(logN) , N为set内元素的个数

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

    erase( )

    删除单个元素

    1. st.erase(it),it为所需要删除元素的迭代器,时间复杂度为O(1),可以结合find()使用
    #include<cstdio>
    #include<set>
    using namespace std;
    
    int main(){
        set<int> st;
        st.insert(100);
        st.insert(200);
        st.insert(100);
        st.insert(300); 
        st.erase(st.find(100)); // 利用find找到100,然后用erase删除
        st.erase(st.find(200));
        for(set<int>::iterator it = st.begin(); it != st.end(); it++)
            printf("%d", *it);
        return 0;
    }
    
    1. st.erase(value)value为所需要删除元素的值,时间复杂度为O(logN)Nset内元素个数
    #include<cstdio>
    #include<set>
    using namespace std;
    
    int main(){
        set<int> st;
        st.insert(100);
        st.insert(200);
        st.insert(100);
        st.insert(300);
        st.erase(100); // 删除set中值为100的元素
    
        for(set<int>::iterator it = st.begin(); it != st.end(); it++)
            printf("%d ", *it);
        return 0;
    }
    

    删除一个区间内的元素

    st.erase(first, last)可以删除一个区间内的所有元素,删除区间是[first, last),时间复杂度为O(last - first)

    #include<cstdio>
    #include<set>
    using namespace std;
    
    int main(){
        set<int> st;
        st.insert(100);
        st.insert(200);
        st.insert(100);
        st.insert(300);
    
        set<int>::iterator it = st.find(200);
        st.erase(it, st.end()); // 删除元素200至set末尾之间的元素,即200,300
    
        for(set<int>::iterator it = st.begin(); it != st.end(); it++)
            printf("%d ", *it);
        return 0;
    }
    

    size( )

    size()用来取得set内元素的个数,时间复杂度为O(1)

    #include<cstdio>
    #include<set>
    using namespace std;
    
    int main(){
        set<int> st;
        st.insert(100);
        st.insert(200);
        st.insert(100);
        st.insert(300);
    
        printf("%d", st.size());
        return 0;
    }
    

    clear( )

    clear()用来清空set中的所有元素,复杂度为O(N)

    #include<cstdio>
    #include<set>
    using namespace std;
    
    int main(){
        set<int> st;
        st.insert(100);
        st.insert(200);
        st.insert(100);
        st.insert(300);
        st.clear();
        printf("%d", st.size());
        return 0;
    }
    

    set的常见用途

    • 自动去重并按升序排序

    Write by Gqq

  • 相关阅读:
    递归--练习5--noi1751分解因数
    递归--练习4--noi666放苹果
    递归--练习3--noi7592求最大公约数问题
    递归--练习2--noi6261汉诺塔
    递归--练习1--noi3089爬楼梯
    JavaScript--语法4--函数1
    JavaScript--语法3--数组
    JavaScript--练习1--99乘法表
    应用排行榜第一名脸萌仅仅是刹那的烟火
    Readprocessmemory使用方法
  • 原文地址:https://www.cnblogs.com/zgqcn/p/12576827.html
Copyright © 2011-2022 走看看