C++ set容器

本文详细介绍了C++标准库中的set容器使用方法,包括插入、查找、删除等基本操作及迭代器的使用,并通过示例代码展示了如何进行元素的遍历和特定范围的删除。

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

set集合容器:

调用头文件:

#include<set>

using namespace std;

详细用法(部分)

set<int> t      ------      定义一个int类型的容器,注意set里的每个元素只会出现1

t.insert(k)      ------      插入元素k,多次插入同一个元素后面无效

t.count(k)      ------      判断元素k是否在容器内

t.erase(k)      ------      删除元素k,若不存在则删除无效

t.clear()      ------      清空容器

t.size()      ------      返回容器现有元素个数

t.empty()      ------      判断容器是否为空

 

想遍历set里的元素或进行进一步修改,必须定义对应迭代器,以下三种定义方法(迭代器类似于指针)

set<int>::iterator it      ------      定义正向迭代器

set<int>::reverse_iterator rit;      ------      定义反向迭代器

auto it = t.begin();      ------      因为t.begin()返回正向迭代器,所以it自动被定义为正向迭代器,可适应其他所有操作

以下需要迭代器的操作:

t.begin()      ------      返回set中第一个元素,类型为正向迭代器

t.rbegin()      ------      返回set中最后一个元素,类型为反向迭代器

t.end()      ------      返回set中最后一个元素,类型为正向迭代器

t.rend()      ------      返回set中第一个元素,类型为反向迭代器

 

t.find(k)      ------      寻找k,若找到返回对应的迭代器,否则返回end();

t.insert(a, b)      ------      插入指针[a, b)之间的元素,已有元素不会再次插入

t.erase(it)      ------      删除迭代器it对应的元素

t.erase(l, r)      ------      删除迭代器[l, r)之间的元素

lower_bound(k)      ------      返回第一个大于等于k的元素的迭代器

upper_bound(k)      ------      返回第一个大于k的元素的迭代器

 

#include<stdio.h>  

#include<set>  

using namespace std;  

set<int> t;  

int main(void)  

{  

    t.insert(5);  

    t.insert(3);  

    t.insert(8);  

    t.insert(9);  

    t.insert(12);  

    printf("the size is %d\n", t.size());  

    printf("%d %d\n", t.count(5), t.count(-1));     //运行结果:1 0  

  

    set<int>::iterator it;  

    for(it=t.begin();it!=t.end();it++)      //运行结果:3 5 8 9 12  

        printf("%d ", *it);  

    printf("\n");  

  

    set<int>::reverse_iterator rit;  

    for(rit=t.rbegin();rit!=t.rend();rit++)     //运行结果:12 9 8 5 3  

        printf("%d ", *rit);  

    printf("\n");  

  

    auto a = t.begin();  

    auto b = t.begin();  

    b++;  

    t.erase(a,b);  

    for(it=t.begin();it!=t.end();it++)      //运行结果:5 8 9 12  

        printf("%d ", *it);  

    printf("\n");  

  

    a = t.lower_bound(6);  

    b = t.upper_bound(8);  

    printf("%d %d\n", *a, *b);      //运行结果:8 9  

    return 0;  

}  

### C++ `set` 容器概述 `set` 是 C++ 标准库中的关联容器之一,用于存储唯一的元素并自动保持这些元素处于排序状态。该容器内部通常通过红黑树实现,这使得插入、删除和查找操作的时间复杂度均为 O(log n)[^4]。 #### 基本构造方式 可以使用默认构造函数创建一个空集合: ```cpp #include <set> using namespace std; // 创建一个空的整数集 set<int> emptySet; ``` 也可以利用已有的数据结构来初始化一个新的 `set` 对象: ```cpp vector<int> vec = {7, 3, 6, 9, 3, 1, 6, 2}; set<int> fromVector(vec.begin(), vec.end()); ``` #### 自定义排序规则 除了按自然顺序排列外,还可以通过提供第二个模板参数来自定义比较逻辑。例如,要建立一个降序排列的整数集合,则可采用如下形式: ```cpp struct Greater { bool operator()(const int& lhs, const int& rhs) const { return lhs > rhs; } }; set<int, Greater> descendingInts; ``` 或者更简洁地使用标准库提供的 `greater<T>` 类型作为第二模板参数: ```cpp set<int, greater<int>> descSet{8, 5, 3, 7}; // 初始化列表语法 ``` 上述两种方法均实现了相同的效果——即构建了一个按照数值大小逆向排序的整数集合[^1][^3]。 #### 集合的基本操作 对于已经存在的 `set` 实例来说,支持多种常见的成员函数来进行增删查改等常规处理动作。下面列举了一些常用的 API 接口及其简单应用实例: - **插入新项** 插入单个元素至集合中: ```cpp set<double> numbers; auto resultPair = numbers.insert(3.14); ``` - **移除现有条目** 移除特定值对应的节点: ```cpp if (!numbers.empty()) { size_t removedCount = numbers.erase(*numbers.begin()); } ``` - **查询是否存在某元素** 判断给定的目标是否存在于当前范围内: ```cpp double targetValue = 2.718; auto foundIt = numbers.find(targetValue); if (foundIt != numbers.end()) { cout << "Found value: " << *foundIt << endl; } else { cout << "Not Found!" << endl; } ``` - **遍历全部组件** 迭代访问每一个成员变量直至结束标志位为止: ```cpp for (const auto& elem : numbers) { printf("%.2f\n", elem); } // 或者传统风格迭代器循环 for (auto iter = numbers.cbegin(); iter != numbers.cend(); ++iter) { cout << *iter << ' '; } ``` 以上就是关于如何运用 C++ 编程语言里的 `set` 数据类型的介绍以及一些基础的操作指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值