C++中set用法

一.关于set

C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户在STL使用过程中,并不会感到陌生。

二.特点

  • map和set的插入删除效率比用其他序列容器高
  • 每次insert之后,以前保存的iterator不会失效
  • 当数据元素增多时,set的插入和搜索速度变化不大(二分查找)

三.set中常用的方法

begin()        ,返回set容器的第一个元素
end()      ,返回set容器的最后一个元素
clear()          ,删除set容器中的所有的元素
empty()    ,判断set容器是否为空
max_size()   ,返回set容器可能包含的元素最大个数
size()      ,返回当前set容器中的元素个数
rbegin     ,返回的值和end()相同
rend()     ,返回的值和rbegin()相同

四.例题应用

乌龟与洞穴

Description

辽阔的太平洋上有一个十分美丽的岛。

岛的海岸上有 n 个洞穴呈环形分布(从逆时针编号0到n−1),有一只乌龟生活在岛上,它早上都会外出觅食,晚上都会回到岛上,然后寻找洞穴睡觉。但是,这只乌龟不会去寻找之前睡过的洞穴入睡,因此每天都需要消耗大量的时间去寻找洞穴。

现在给你 n 天晚上乌龟回来的洞穴位置,你能帮助它寻找每天入睡的洞穴吗?注意:乌龟只会沿逆时针寻找洞穴。

Input

第一行包含一个整数 T (1≤T≤1000)T (1≤T≤1000) 代表测试组数,对于每一组测试:

第一行一个整数 nn (1≤n≤105)(1≤n≤105) 表示洞穴的个数以及总共的天数 。

第二行 nn 个整数 aiai (0≤ai≤n−1)(0≤ai≤n−1)  表示第 ii 天回来的洞穴位置。

数据保证所有测试中 n的和不超过 10的6次方。

Output

对于每组测试,输出一行,包含 n 个整数,第 i个整数表示第 i天乌龟入睡的洞穴的编号。

输入

2
6
4 5 5 0 4 3
4
1 1 1 1

输出

4 5 0 1 2 3
1 2 3 0
#include<bits/stdc++.h>
 
using namespace std;
 
int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        set<int> s;
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++) {
            s.insert(i);
        }
        while (n--) {
            int x;
            scanf("%d", &x);
            //lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
            auto it = s.lower_bound(x);
            //s.end()没有值
            if (it == s.end()) {
                it = s.begin();
            }
            printf("%d%c", *it, " \n"[n == 0]);
            s.erase(it);
        }
    }
    return 0;
    }
C++中的`set`是一个关联容器,用于存储唯一的元素,并且自动对元素进行排序。`set`中的元素是按照一定的顺序存储的,默认情况下是按照升序排列的。`set`的主要特点如下: 1. **唯一性**:集合中的元素是唯一的,不能有重复的元素。 2. **自动排序**:元素会自动按照升序排列。 3. **快速查找**:查找、插入和删除操作的时间复杂度为O(log n)。 ### 基本用法 #### 1. 包含头文件 要使用`set`,需要包含头文件`<set>`。 ```cpp #include <iostream> #include <set> ``` #### 2. 定义和初始化 可以通过多种方式定义和初始化一个`set`。 ```cpp std::set<int> s; // 定义一个空的整数集合 std::set<int> s = {1, 2, 3, 4, 5}; // 定义并初始化一个整数集合 ``` #### 3. 插入元素 可以使用`insert`方法向集合中插入元素。 ```cpp s.insert(6); // 插入元素6 ``` #### 4. 查找元素 可以使用`find`方法查找元素。 ```cpp if (s.find(3) != s.end()) { std::cout << "找到元素3" << std::endl; } else { std::cout << "未找到元素3" << std::endl; } ``` #### 5. 删除元素 可以使用`erase`方法删除元素。 ```cpp s.erase(4); // 删除元素4 ``` #### 6. 遍历集合 可以使用迭代器遍历集合。 ```cpp for (auto it = s.begin(); it != s.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; ``` ### 示例代码 以下是一个完整的示例代码,展示了`set`的基本用法: ```cpp #include <iostream> #include <set> int main() { std::set<int> s; // 插入元素 s.insert(3); s.insert(1); s.insert(4); s.insert(1); // 重复元素,不会插入 // 查找元素 if (s.find(3) != s.end()) { std::cout << "找到元素3" << std::endl; } else { std::cout << "未找到元素3" << std::endl; } // 删除元素 s.erase(4); // 遍历集合 for (auto it = s.begin(); it != s.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值