C++STL——Set

set,翻译为集合。是一个可以插入元素时自动从小到大排序且自动去重的 STL 容器。说直白点,就是一个桶,加了很多自定义函数。set 的内部是一个红黑树,支持的数据类型有整型,浮点型,字符型,字符串等。

需要的头文件:
 

#include<set>

包含在 

#include<bits/stdc++.h>

 如何定义 set?

set 的定义格式:

set<typename> name;

例: 

set<int> s;

 如上所说,其中的 typename 可以为整型,浮点型,字符型,字符串等。还可以为其他 STL 容器,如 set,queue,vector 等。

set 数组的定义格式:

set<typename> Arrayname[Arraysize];

例: 

set<int> s[105];

如此,s[0] s[Arraysize-1] 皆为 set 容器。

如何访问 set?

set 只能用迭代器访问。

set<typename>:: iterator it;

其中 typename 为 set 定义时的类型。

对于 c++11 及以上的朋友们,有个福利,即是将迭代器的定义移交给关键字 auto。 

auto it=a.begin();

auto 会自动识别数据类型,避免忘了迭代器的定义。 

可以通过迭代器 *it 访问 set 中的元素。 

可以发现,set 有自动去重且自动排序的功能。印证了上面所陈述的功能。

除 vector,set,string 的STL容器都不可以用 *(it+1) 的遍历方式。

set 常用内置函数:

(1) insert():

s.insert(x) 可将 x 插入到 s 的最后,并自动去重及排序。时间复杂度 O(logN),N 为 s 中的元素个数。

  (2) find():

s.find(value),返回值为 value 的迭代器,找不到则返回s.end()。时间复杂度 O(logN),N 为 s 中的元素个数。

 (3) size():

s.size(),返回的 s 中的元素个数,时间复杂度为 O(1)。

(4)  clear():

s.clear() 将 s 清空。时间复杂度为 O(N),N 为 s 中的元素个数。

 (4)  erase():

erase() 有两种方法: 删除单个元素、删除一个区间内的所有元素。

1.删除单个元素。s.erase(it)。it 为需要删除元素的迭代器。时间复杂度为O(1)。

可以结合 find() 来使用:s.erase(s.find(value)) 。

如果要删除一个数值,s.erase(value),时间复杂度 O(logN),N 为 s 中的元素个数。

2. 删除一个区间的元素。

s.erase(first,last) 可以删除一个区间内的所有元素。

其中 first 为所需删除区间的起始迭代器,而 last 则为所需要删除区间的末尾迭代器的下一个地址,即删除 [first,last) 内的所有元素。时间复杂度为 O(last-first)。

 

完结撒花!!!

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用提供了一些使用set的常见操作和方法。如果要访问set中的最后一个元素,有几种方法可以实现。第一种方法是使用rbegin()函数,它返回一个指向set中最后一个元素的反向迭代器,然后可以使用*运算符来获取该元素的值。第二种方法是使用end()函数返回一个指向set末尾的迭代器,然后通过--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。第三种方法是直接使用end()函数返回的迭代器,然后使用--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。提供了一个重载<运算符的示例代码。在这个示例中,定义了一个结构体node,并在结构体中重载了<运算符。通过重载<运算符,我们可以自定义set中元素的比较规则。在main函数中,创建了一个set<node>类型的集合s,并插入了一些元素。通过遍历集合s,我们可以看到集合中的元素按照我们定义的比较规则进行排序。介绍了set中lower_bound和upper_bound函数的使用。lower_bound函数返回大于或等于给定值的第一个元素的迭代器,而upper_bound函数返回大于给定值的第一个元素的迭代器。在示例代码中,首先创建了一个set<int>类型的集合s,并插入了一些元素。然后使用lower_bound和upper_bound函数分别查找给定值的边界,并输出对应的元素值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STLset详解](https://blog.csdn.net/qq_50285142/article/details/122304728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【c++STL——第八讲】set系列 (常用知识点总结)](https://blog.csdn.net/m0_63233163/article/details/124645182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值