C++ Set 容器

 set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。
平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。
构造set集合主要目的是为了快速检索,不可直接去修改键值。

常用操作:
1.元素插入:insert()
2.中序遍历:类似vector遍历(用迭代器)
3.反向遍历:利用反向迭代器reverse_iterator。
    例:
    set<int> s;
    ......
    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<<"未找到";
6.自定义比较函数
    (1)元素不是结构体:
        例:
        //自定义比较函数myComp,重载“()”操作符
        struct myComp
        {
            bool operator()(const your_type &a,const your_type &b)
            [
                return a.data-b.data>0;
            }
        }
        set<int,myComp>s;
        ......
        set<int,myComp>::iterator it;
    (2)如果元素是结构体,可以直接将比较函数写在结构体内。
        例:
        struct Info
        {
            string name;
            float score;
            //重载“<”操作符,自定义排序规则
            bool operator < (const Info &a) const
            {
                //按score从大到小排列
                return a.score<score;
            }
        }
        set<Info> s;
        ......
        set<Info>::iterator it;

### 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、付费专栏及课程。

余额充值