C++语言基础 —— STL —— 容器与迭代器 —— set 与 multiset

【概述】

set 和 multiset 是集合数据容器,通过链表进行组织,具体实现采用了红黑树的平衡二叉树的数据结构,两者均定义在 <set> 头文件中,其会根据特定的规则,自动将元素排序。

两者不同在于,set 不允许元素重复,而 multiset 允许元素重复。

在插入操作和删除操作上比 vector 快,但查找或添加末尾的元素时会有些慢。

【定义】

定义: set<type> setName、multiset<type> multisetName

  • set<type> s:产生一个空的 set/multiset,其中不含任何元素
  • set<type> s(op):以 op 为排序准则,生成一个 set/multiset
  • set<type> s1(s2):产生某个 set/multiset 的副本,所有元素均被复制
  • set<type> s(beg, end):以迭代器的区间 [beg; end] 内的元素产生一个 set/multiset
  • set<type> s(beg, end, op):以 op 为排序准则,利用迭代器的区间 [beg; end] 内的元素生成一个 set/multiset

默认情况下,由小到大排序,若想按照自己的方式排序,一般重载小于号

struct type{
    int x,y;
    bool operator < (const type &a) const{
        if(x!=a.x)
            return x<a.x;
        return y<a.y;
    }
}
set<type> s;

【基本操作】

对于 set<type> s 的基本操作有:

  • s.size():返回容器大小
  • s.empty():返回容器是否为空。
  • s.clear():清空容器
  • s.count(elem):返回元素值为 elem 的元素的个数
  • s.insert(elem) :加入一个 elem 副本,返回新元素位置
  • s.erase(elem):移除与 elem 元素相等的所有元素,返回被移除的元素个数

【迭代器操作】

对于 set<type> s 的迭代器 it 的操作有:

  • s.begin():返回一个双向迭代器,指向第一个元素
  • s.end():返回一个双向迭代器,指向最后一个元素的下一 个位置
  • s.erase(it):移除迭代器 it 所指位置上的元素,无返回值
  • s.lower_bound(elem):返回 elem 的第一个可安插的位置,即元素值 >= elem 的第一个元素位置
  • s.upper_bound(elem):返回 elem 的最后一个可安插的位置,即元素值 > elem 的第一个元素的位置

【自定义数据类型】

当要在 multiset 中存储自定义数据类型时,除了要写自定义类型的存储结构外,还要写一个比较函数 cmp 来告诉 multiset 如何去比较自定义类型。

struct Node{
    int x,y;
};
struct cmp{
    bool operator()(const Node &a,const Node &b){
        if(a.x==b.x)
            return a.y<b.y;
        return a.x<b.x;
    }
};
multiset<Node,cmp> s;

 

posted @   老程序员111  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示