C里边的STL里边的Set函数

本文详细介绍了C++ STL中的set函数用法,包括去重、排序及如何使用multiset保留重复元素。此外还提供了丰富的代码示例,帮助读者更好地理解和运用set函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set函数的用法:

这是一个集合函数,这个函数可以处理很多的元素,这些元素可以去重,把相同的元素都去掉,剩下不一样的元素,而且还可以自动给这些元素来排序,从小到大的顺序来排序。

这里我们先来举个例子:

比如:

#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> a;
a.insert(1);
a.insert(9);
a.insert(6);
a.insert(6);
set<int>::iterator i=a.begin();//这里只能使用迭代器,因为对于set集合里边的元素是不能够想访问那个就能访问哪个的,他是像一个栈一样,需要从前往后一一访问,他并不是一个指针就可以跳跃性访问的。这里iterator是一个迭代器,申明方法只能是这样,当让写法是不一样的也行。
while(i!=a.end())
{
cout<<(*i)<<endl;//注意这里需要使用一个*,来代表一个迭代器所指向的那个地址的内容。。。
i++;
}
}

输出就是1 6 9,这里把那个重复出现的6给去掉了。

下边再来想一个问题,能不能我不用去重的集合函数怎么写?当然这里严格意义上说,这个并不是集合,因为这个已经不满足集合的互异性的性质了,但是这里我们为了方便起见,权且叫他集合。。。那么这里就需要把那个set改换成multiset,代码如下:

#include<iostream>
#include<set>
using namespace std;
int main()
{
    multiset<int> a;//改了这里.
    a.insert(1);
    a.insert(9);
    a.insert(6);
    a.insert(6);
    multiset<int>::iterator i=a.begin();//改了这里
    while(i!=a.end())
    {
        cout<<(*i)<<endl;
        i++;
    }

输出结果:

1 6 6 9
下边可能有同学会问,这里能不能将这些元素从大到小来排序?

当然可以,STL是一个没有你想得到写不到的函数的集合,它里边所有的集合,只有你想不到,没有他做不到的。。。这里就是这样改,把set<int>a,改成set<int,compare>a;下边来看一下这个:
#include<iostream>
#include<set>
using namespace std;
struct compare//注意这里很多的map,set函数之类的都是使用结构体,而像sort函数之类的是直接使用函数就行了
{
  bool operator()(int a,int b){//注意这里有2个括号,很容易遗忘,其那边一个只是用来重载括号的,后边一个是里边的参数
      return a>b;
  }
};
int main()
{
    set<int,compare>a;//调用的时候是不一样的,需要注意下
    int i=0;
    while(i++<10)
        a.insert(i);
    for(set<int,compare>::iterator j=a.begin();j!=a.end();j++)//还有这里,需要特别注意
        cout<<*(j)<<" ";
    return 0;
}
}

输出10 9 8 7 6 5 4 3 2 1

下边就是直接复制别人的,大家可以去看下:

set的各成员函数列表如下:

c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器

c++ stl容器set成员函数:clear()--清除所有元素

c++ stl容器set成员函数:count()--返回某个值元素的个数

c++ stl容器set成员函数:empty()--如果集合为空,返回true

c++ stl容器set成员函数:end()--返回指向最后一个元素的迭代器

c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器

c++ stl容器set成员函数:erase()--删除集合中的元素

c++ stl容器set成员函数:find()--返回一个指向被查找到元素的迭代器

c++ stl容器set成员函数:get_allocator()--返回集合的分配器

c++ stl容器set成员函数:insert()--在集合中插入元素

c++ stl容器set成员函数:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

c++ stl容器set成员函数:key_comp()--返回一个用于元素间值比较的函数

c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最大限值

c++ stl容器set成员函数:rbegin()--返回指向集合中最后一个元素的反向迭代器

c++ stl容器set成员函数:rend()--返回指向集合中第一个元素的反向迭代器

c++ stl容器set成员函数:size()--集合中元素的数目

c++ stl容器set成员函数:swap()--交换两个集合变量

c++ stl容器set成员函数:upper_bound()--返回大于某个值元素的迭代器

c++ stl容器set成员函数:value_comp()--返回一个用于比较元素间的值的函数


c++ stl集合set插入,遍历用法举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream> 
#include<set> 
using namespace std; 
//set插入元素操作  
int main() 
    //定义一个int型集合对象s,当前没有任何元素.由www.169it.com搜集整理
    set<int> s; 
    s.insert(8);  //第一次插入8,可以插入  
    s.insert(1); 
    s.insert(12); 
    s.insert(6); 
    s.insert(8);   //第二次插入8,重复元素,不会插入  
    set<int>::iterator it; //定义前向迭代器 
    //中序遍历集合中的所有元素  
    for(it=s.begin();it!=s.end();it++) 
    cout<<*it<<endl;    
    system("pause"); 
    return 0; 
}

<think>嗯,用户想了解C++STLset的用法和特性。首先,我需要回忆一下set的基本概念。set是一个关联容器,存储唯一元素,并且自动排序。它基于红黑树实现,所以插入、删除和查找的时间复杂度都是对数级别的。那用户可能想知道如何初始化set、插入元素、遍历元素,以及一些常用的成员函数吧。接下来,我得参考提供的引用内容。比如引用[1]中的示例代码展示了如何包含头文件、定义set和使用迭代器遍历。引用[2]则展示了不同的构造方法,比如空容器、迭代器区间构造和拷贝构造。引用[3]提到了multisetset的区别,可以对比说明。引用[4]分类了关联容器,set属于有序集合。用户可能还关心set的特性,比如自动排序、元素唯一性,以及与其他容器(比如unordered_set)的区别。需要分点说明,结构清晰。比如初始化方式、常用操作(插入、删除、查找)、迭代器使用,还有性能分析。 还要注意生成相关问题,可能涉及应用场景、性能优化、与map的比较等。需要确保问题相关且有价值,帮助用户深入理解。另外,用户提到要使用中文回答,保持口语化,但作为思考过程,这里用中文整理思路。同时,确保LaTeX格式正确,行内公式用$...$,独立公式单独成段。不过set的内容可能较少涉及数学公式,但如果有复杂度分析,比如时间复杂度O(log n),需要用正确格式。最后,检查是否有遗漏的特性或常见用法,比如自定义比较函数、lower_bound和upper_bound方法,或者与其他STL算法的结合使用。这些内容能帮助用户全面掌握set的用法。</think>### C++ STL set用法详解 #### 一、基本特性 1. **有序唯一容器**:自动按升序排列元素,存储唯一值(重复插入会被忽略)[^1] 2. **底层实现**:基于红黑树(Red-Black Tree)数据结构,保证$O(\log n)$的插入、删除和查找时间复杂度[^4] 3. **头文件**:`#include <set>` #### 二、核心操作 ```cpp // 初始化示例 set<int> s = {5,2,8,1}; // 自动排序为{1,2,5,8}[^2] // 插入元素 s.insert(3); // 插入后自动排序 // 删除元素 s.erase(2); // 删除指定元素 // 查找元素 auto it = s.find(5); // 返回迭代器,未找到返回s.end()[^3] ``` #### 三、迭代器使用 ```cpp // 正向遍历 for(auto it=s.begin(); it!=s.end(); ++it){ cout << *it << " "; } // 反向遍历 for(auto rit=s.rbegin(); rit!=s.rend(); ++rit){ cout << *rit << " "; } ``` #### 四、常用成员函数 | 函数 | 功能描述 | 时间复杂度 | |----------------------|---------------------------------|-----------| | `size()` | 返回元素个数 | $O(1)$ | | `empty()` | 判断是否为空 | $O(1)$ | | `count(key)` | 统计指定元素出现次数(0或1) | $O(\log n)$ | | `lower_bound(key)` | 返回第一个≥key的迭代器 | $O(\log n)$ | | `upper_bound(key)` | 返回第一个>key的迭代器 | $O(\log n)$ | #### 五、特殊用法 1. **自定义排序规则** ```cpp struct Compare { bool operator()(const int& a, const int& b) const { return a > b; // 降序排列 } }; set<int, Compare> customSet; ``` 2. **与multiset的区别**:允许重复元素存储,其他接口相同[^3] ```cpp multiset<int> ms; ms.insert(2); // 可插入多个相同元素 ms.insert(2); ``` #### 六、性能建议 1. 优先使用`insert`的返回值获取插入结果 ```cpp auto ret = s.insert(value); if(ret.second) { // 插入成功处理 } ``` 2. 批量插入时建议使用迭代器范围构造 ```cpp vector<int> vec{7,4,9}; set<int> s(vec.begin(), vec.end()); // 效率高于逐个插入[^2] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值