set集合容器用法

本文详细介绍了C++标准库中的set容器,包括其基于红黑树实现原理、常见操作如插入、遍历、删除和查找等。同时,还探讨了如何自定义比较函数来满足特定需求。

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

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++中,如果需要计算油漆覆盖的区域并涉及到使用集合容器,比如`std::set`(无序不重复元素集),通常这种场景下并不是直接处理面积,而是处理不重复的区域边界点。例如,如果你有一个二维数组表示网格,每个单元格代表一个像素,你可以用集合存储每个像素的位置(如坐标对`(x, y)`),因为一个像素可能位于多个相连区域的边缘。 这里是一个简化的示例: ```cpp #include <iostream> #include <set> // 假设我们有简单的像素类 Pixel class Pixel { public: int x; int y; // 构造函数等... }; std::set<Pixel> paintPoints; // 存储油漆点 void addPaintArea(int x, int y) { // 添加一个像素到集合 Pixel p = {x, y}; paintPoints.insert(p); } int calculatePaintedArea() { int area = 0; for (const auto& pixel : paintPoints) { // 对于每个像素,检查与其相邻的像素是否也在集合中 if (isAdjacent(pixel)) { area++; } } return area * 1; // 假设每个像素大小为1平方单位(实际项目中替换为真实尺寸) } bool isAdjacent(const Pixel& p) { // 判断一个像素是否与给定像素相邻 // ... 实现判断逻辑 ... return false; } int main() { // 初始化paintPoints并添加区域边界 addPaintArea(0, 0); // 假设这是左上角 // ... 添加其他边界点 ... int paintedArea = calculatePaintedArea(); std::cout << "The total painted area is: " << paintedArea << " square units.\n"; return 0; } ``` 在这个例子中,`calculatePaintedArea()`函数会计算出有多少像素是通过其相邻像素连接起来的,而`paintPoints`集合用于跟踪这个过程。但是请注意,这种方法仅适用于理想情况下的简单形状,对于复杂的连通区域,可能需要更复杂的数据结构(如图论算法)来进行分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值