zoukankan      html  css  js  c++  java
  • STL set 常见用法详解

    《算法笔记》学习笔记

    set 常见用法详解

    **set是一个内部自动有序且不含重复元素的容器 **

    1. set 的定义

    //单独定义一个set
    set<typename> name;
    
    //这里的typename可以是任何基本类型
    set<int> name;
    set<double> name;
    set<char> name;
    set<node> name; //node是结构体的类型
    
    //如果typename是一个STL容器,那么定义时要记得在>>符号之间加上空格
    set<vector<int> > name;
    
    //set的数组定义
    set<typename> Arrayname[arraySize];
    //Arrayname[0]~Arrayname[arraySize - 1]中的每一个都是set容器
    set<int> a[100];
    

    2. set 容器内元素的访问

    //set 只能通过迭代器(iterator)访问
    set<typename>::iterator it;
    
    //迭代器定义
    //set内的元素自动递增排序,且自动去除了重复元素
    //得到迭代器,并且可以通过*it来访问set里的元素
    set<int>::iterator it;
    set<char>::iterator it;
    
    //除开vector和string之外的STL容器都不支持*(it + i)的访问方式
    #include <stdio.h>
    #include <set>
    using namespace std;
    int main() {
        set<int> st;
        st.insert(3);   //insert(x)将x插入set中
        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;
    }
    

    3. set 常用函数实力解析

    **(1) insert() **

    // insert(x)可将 x 插入 set 容器中,并自动递增排序和去重,时间复杂度O(logN)  
    

    **(2) find() **

    //find(value)返回set中对应值为value的迭代器,时间复杂度为O(logN)
    #include <stdio.h>
    #include <set>
    using namespace std;
    int main() {
        set<int> st;
        for(int i = 1; i <= 3; i++) {
            st.insert(i);
        }
        set<int>::iterator it = st.find(2); //在set中查找2,返回其迭代器
        printf("%d
    ", *it);
        //以上两句也可以直接写成printf("%d
    ", *(st.find(2)));
        return 0;
    }
    

    **(3) erase() **

    //erase()有两种用法:删除单个元素,删除一个区间内的所有元素
    // 1. 删除单个元素
    //删除单个元素的方法有两种
    //st.erase(it), it为所需要删除元素的迭代器。时间复杂度为O(1)
    #include <stdio.h>
    #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;
    }
    
    //st.erase(value), value为所需要删除元素的值。时间复杂度为O(logN)
    #include <stdio.h>
    #include <set>
    using namespace std;
    int main() {
        set<int> st;
        st.insert(100);
        st.insert(200);
        st.erase(100);  //删除set中值为100的元素
        for(set<int>::iterator it = st.begin(); it != st.end(); it++) {
            printf("%d
    ", *it);    //只输出200
        }
        return 0;
    }
    
    
    // 2.删除一个区间内的所有元素
    //st.erase(first, last)可以删除一个区间内的所有元素
    //first为所需要删除区间的起始迭代器,last则为所需要删除区间的末尾迭代器的下一地址
    //即删除[first, last), 时间复杂度为O(last - first)
    #include <stdio.h>
    #include <set>
    using namespace std;
    int main() {
        set<int> st;
        st.insert(20);
        st.insert(10);
        st.insert(40);
        st.insert(30);
        set<int>::iterator it = st.find(30);
        st.erase(it, st.end()); //删除元素30至set末尾之间的元素,即30和40
        for(it = st.begin(); it != st.end(); it++) {
            printf("%d ", *it); //输出10 20
        }
        return 0;
    }
    

    **(4) size() **

    //size()用来获得set内元素的个数,时间复杂度为O(1)
    #include <stdio.h>
    #include <set>
    using namespace std;
    int main() {
        set<int> st;
        st.insert(2);
        st.insert(5);
        st.insert(4);
        printf("%d
    ", st.size());  //输出set内元素的个数
        return 0;
    }
    

    **(5) clear() **

    //clear()用来清空set中的所有元素,复杂度为O(N)
    #include <stdio.h>
    #include <set>
    using namespace std;
    int main() {
        set<int> st;
        st.insert(2);
        st.insert(5);
        st.insert(4);
        st.clear(); //清空set
        printf("%d
    ", st.size());
        return 0;
    }
    

    3. set的常见用途

    • set最主要的作用时自动去重并按升序排序
  • 相关阅读:
    面试再问HashMap,求你把这篇文章发给他!
    Maven Nexus私库搭建及使用,你还不会吗?
    两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践
    @Controller,@Service,@Repository,@Component你搞懂了吗?
    mysql 输出当前月所有日期与对应的星期
    mysql创建每月执行一次的event
    一个关于explain出来为all的说明及优化
    怎么快速了解自己的MySQL服务器
    Mysql查找所有项目开始时间比之前项目结束时间小的项目ID
    Device eth0 does not seem to be present,delaying initialization解决方法
  • 原文地址:https://www.cnblogs.com/isChenJY/p/11535335.html
Copyright © 2011-2022 走看看