zoukankan      html  css  js  c++  java
  • 详解C++ STL set 容器

    详解C++ STL set 容器

    本篇随笔简单介绍一下(C++STL)(set)容器的使用方法及常见使用技巧。

    set容器的概念和性质

    (set)在英文中的意义是:集合。(set)容器也的确“人如其名”,实现了这个集合的功用。

    高中数学必修一集合那章(高一以下的小伙伴不用慌,不讲数学只讲概念),关于集合的性质,给出了三个概念:无序性、互异性、确定性

    那么,(set)容器的功用就是维护一个集合,其中的元素满足互异性。

    我们可以将其理解为一个数组。这个数组的元素是两两不同的。

    这个两两不同是指,如果这个(set)容器中已经包含了一个元素(i),那么无论我们后续再往里假如多少个(i),这个(set)中还是只有一个元素(i),而不会出现一堆(i)的情况。这就为我们提供了很多方便。

    但是,需要额外说明的是,刚刚说集合是有无序性的,但是(set)中的元素是默认排好序(按升序排列)的。(稍微说一句,(set)容器自动有序和快速添加、删除的性质是由其内部实现:红黑树(平衡树的一种)。这个东西过于高深我不会,所以不予过多介绍,有兴趣的小伙伴可以自行浏览相关内容。)

    set容器的声明

    (set)容器的声明和大部分(C++STL)容器一样,都是:容器名<变量类型> 名称的结构。前提需要开#include库。如:

    #include<set>
    set<int> s;
    set<char> s;
    set<pair<int,int> > s;
    set<node> s;
    struct node{...};
    

    set容器的使用

    其实,(C++STL)容器的使用方式都是差不多的。我们完全可以举一反三地去类比。与(bitset)重定义了许多奇形怪状新的函数之外,其他都是大致相同的。所以笔者在此不再做幼稚的介绍,大家都是竞赛狗,应该都能自己看明白。

    s.empty();
    

    (empty())函数返回当前集合是否为空,是返回1,否则返回0.

    s.size();
    

    (size())函数返回当前集合的元素个数。

    s.clear();
    

    (clear())函数清空当前集合。

    s.begin(),s.end();
    

    (begin())函数和(end())函数返回集合的首尾迭代器。注意是迭代器。我们可以把迭代器理解为数组的下标。但其实迭代器是一种指针。这里需要注意的是,由于计算机区间“前闭后开”的结构,(begin())函数返回的指针指向的的确是集合的第一个元素。但(end())返回的指针却指向了集合最后一个元素后面一个元素。

    s.insert(k);
    

    (insert(k))函数表示向集合中加入元素(k)

    s.erase(k);
    

    (erase(k))函数表示删除集合中元素(k)。这也反映了(set)容器的强大之处,指哪打哪,说删谁就删谁,完全省略了遍历、查找、复制、还原等繁琐操作。更不用像链表那种数据结构那么毒瘤。直接一个函数,用(O(logn))的复杂度解决问题。

    s.find(k);
    

    (find(k))函数返回集合中指向元素(k)的迭代器。如果不存在这个元素,就返回(s.end()),这个性质可以用来判断集合中有没有这个元素。

    其他好用的函数

    下面介绍一些不是很常用,但是很好用的(set)容器的内置函数

    s.lower_bound(),s.upper_bound();
    

    熟悉(algorithm)库和二分、离散化的小伙伴会对这两个函数比较熟悉。其实这两个函数比较常用。但是对于(set)集合来讲就不是很常用。其中(lower\_bound)返回集合中第一个大于等于关键字的元素。(upper\_bound)返回集合中第一个严格大于关键字的元素。

    s.equal_range();
    

    这个东西是真的不常用...可能是我太菜了

    这个东西返回一个(pair)(内置二元组),分别表示第一个大于等于关键字的元素,第一个严格大于关键字的元素,也就是把前面的两个函数和在一起。如果有一个元素找不到的话,就会返回(s.end())

  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11820365.html
Copyright © 2011-2022 走看看