Set 容器的使用及方法

本文详细介绍了C++ STL中的set容器使用方法,包括元素的插入、遍历、删除及检索等基本操作,并列举了set容器的主要成员函数,如begin()、clear()、find()等。

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

using namespace std;

set<int>:s;
1.元素插入:s.insert()
2.中序遍历:类似vector遍历(用迭代器)

set<int>::reverse_iterator rit=s.begin();

while(rit!=s.end())

{

  printf("%d",*rit++);

}

3.反向遍历:利用反向迭代器reverse_iterator。

    set<int>::reverse_iterator rit;
    for(rit=s.rbegin();rit!=s.rend();rit++)
4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。
            set<int> s;
            s.erase(2);        //删除键值为2的元素
            s.clear();
5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。
            set<int> s;
            set<int>::iterator it;
            it=s.find(5);    //查找键值为5的元素
            if(it!=s.end())    //找到
                cout<<*it<<endl;
            else            //未找到
                cout<<"未找到";

C++成员函数:

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()--返回一个用于比较元素间的值的函数

<think>我们被要求回答关于C++set容器使用方法和示例。根据引用内容,set是一个有序容器,基于红黑树实现,元素自动排序,且不允许重复(multiset允许重复)。我们可以自定义排序规则。回答结构:1.引入set容器的基本概念和特性。2.介绍set的基本操作(初始化、插入、删除、遍历、查找等)。3.如何自定义排序规则(使用仿函数或函数指针)。4.给出示例代码。注意:引用中提供了多个示例,我们将整合这些信息,并按照要求使用中文回答,同时确保LaTeX格式正确。另外,根据系统级指令,我们需要在回答末尾生成相关问题。引用标识:我们在回答中会引用到提供的引用内容,在末尾添加引用标识。开始回答:</think>### C++ set 容器使用详解 #### 一、基本概念 `std::set` 是 C++ STL 中的**有序关联容器**,基于红黑树实现,具有以下特性: 1. **自动排序**:元素默认按升序排列(可通过自定义规则修改) 2. **唯一性**:元素不允许重复(需重复元素时使用 `multiset`) 3. **高效操作**:插入、删除、查找的时间复杂度均为 $O(\log n)$ #### 二、基本操作 ##### 1. 初始化与插入 ```cpp #include <iostream> #include <set> using namespace std; int main() { set<int> s1; // 默认升序 set<int, greater<int>> s2; // 显式降序 s1.insert(30); // 插入元素 s1.insert({20, 50, 10}); // 批量插入 cout << "s1: "; for (auto x : s1) cout << x << " "; // 输出:10 20 30 50 } ``` ##### 2. 删除与查找 ```cpp s1.erase(20); // 删除元素20 auto it = s1.find(30); // 查找元素 if (it != s1.end()) { cout << "Found: " << *it; // 输出:Found: 30 } s1.clear(); // 清空容器 ``` ##### 3. 容量判断 ```cpp cout << "Size: " << s1.size(); // 元素数量 cout << "Empty: " << s1.empty(); // 是否为空 ``` #### 三、自定义排序规则 通过**仿函数(Functor)** 实现自定义排序: ```cpp // 定义仿函数(按个位数排序) struct DigitCompare { bool operator()(int a, int b) const { return (a % 10) < (b % 10); } }; int main() { set<int, DigitCompare> numSet; numSet.insert({42, 17, 35, 61}); for (auto x : numSet) cout << x << " "; // 输出:61 42 35 17(按个位:1<2<5<7) } ``` #### 四、存储自定义类型 需为自定义类型指定排序规则: ```cpp struct Person { string name; int age; }; // 按年龄降序 struct AgeCompare { bool operator()(const Person& a, const Person& b) const { return a.age > b.age; } }; int main() { set<Person, AgeCompare> people; people.insert({"Alice", 30}); people.insert({"Bob", 25}); for (auto& p : people) cout << p.name << ": " << p.age << endl; // 输出:Alice:30 → Bob:25 } ``` #### 五、关键特性对比 | 操作 | 时间复杂度 | 说明 | |--------------|------------|--------------------------| | `insert()` | $O(\log n)$ | 插入新元素 | | `erase()` | $O(\log n)$ | 删除指定元素 | | `find()` | $O(\log n)$ | 查找元素 | | `count()` | $O(\log n)$ | 统计特定元素数量(0或1) | | `lower_bound()` | $O(\log n)$ | 返回首个不小于某值的迭代器 | > **注意**:`set` 的元素不可直接修改(可能破坏排序),需先删除再插入新值[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值