2. 入门并实践STL——set篇

set的常见用法详解

  • 集合,自动内部有序且不含重复元素的容器。
  • 使用环境
    • 去掉重复元素
    • 元素比较大或者类型不是int而不能直接开散列表
    • 自动排序
  1. How to use?
    #include
    using namespace std;
    
  2. set的定义
    • 单独定义一个set:set name;
    • set数组的定义: set nameArray[size];
  3. 访问元素
    除开vector和string之外的stl容器都不支持*(it+1)的访问方式
  4. 常用函数解析
    • insert(x): O(logN),自动递增排序和去重
    • find(value): 返回set中对应值为value的迭代器,O(logN)
    set st;
    set::iterator it = st.find(2);
    printf("%d", *it);
    // 也可以
    printf("%d", *st.find(2));
    
    • erase(): 删除单个元素,删除一个区间内的元素

      • 删除单个元素
        1. erase(it): it为所需要删除的迭代器,O(1).可以结合find(value)来使用。 例:st.erase(st.find(5));
        2. erase(value): value为所需要删除的元素。O(logN)

      • 删除一个区间的元素
        - st.erase(first, last)删除[first, last), O(last-first)

    • size(), O(1)

    • clear(), O(n

  • 主要作用
    • 自动去重按升序排序
  • 延伸:
    • set中元素是唯一的,如果需要处理不唯一的情况,则需要使用multiset。另外,c++11标准中还增加了unordered_set,以散列替代set内部的红黑树实现,使其可以用来处理去重但不排序的需求,速度比set要快得多

相关习题

  • Set Similarity
    • 如何输出%
#include
#include
#include
#include
using namespace std;

int main() {
    int N;
    scanf("%d", &N);
    vector > nums(N+1);
    for(int i = 1; i <= N; i++) {
        int M;
        scanf("%d", &M);
        for(int j = 0; j < M; j++) {
            int num;
            // printf("[i: %d]", i);
            scanf("%d", &num);
            nums[i].insert(num);
        }
    }
    //
    int K;
    scanf("%d", &K);
    for(int a = 0; a < K; a++) {
        int x, y;
        scanf("%d%d", &x, &y);
        int wholesize = nums[x].size() + nums[y].size();
        set tmp;
        for(set::iterator it1 = nums[x].begin(); it1 != nums[x].end(); it1++) {
            tmp.insert(*it1);
        }
        for(set::iterator it2 = nums[y].begin(); it2 != nums[y].end(); it2++) {
            tmp.insert(*it2);
        }
        int completesize = tmp.size();
        int commonsize = wholesize - completesize;
        printf("%.1f%%\n", (float(commonsize)/completesize) * 100);
    }
    return 0;
}

你可能感兴趣的:(2. 入门并实践STL——set篇)