STL——set

7 篇文章 0 订阅
7 篇文章 0 订阅

set/multiset:

set每个数都是唯一的,默认按照从小到大排序
multiset每个数可以多个存在,也是从小到大排序

set<容器适配器> name;
set:: iterator it; 声明一个适用于int类型set的迭代器,变量名it
set::reverse_iterator rit; 声明一个反向迭代器
insert( 数) 将这个数插入
insert(指针first,指针last) 将这个区间内的数插入
insert (指针,数) 将数插入指定位置
erase(数) 将这个数删除,如果是multiset则所有这个数都删掉
erase(指针) 将这个位置的数删除
erase(指针first,指针last) 将这个区间内的数删除
lower_bound / upper_bound(指针first,指针last,数) 二分查找第一个大于等于/严格大于 指定数的数,返回一个指向这个位置的指针。若找不到返回end()
bigin() 第一个
end() 尾指针,最后一个的后面一个
rbegin() 倒数第一个
rend() 倒数的尾指针,第一个的前面一个
——前缀r 的都是反向迭代器,要用reverse_iterator

酒店

Time Limit: 1000MS Memory Limit: 1000K

Description

商店有n瓶酒,每瓶酒有一个度数xi,
有Q个人来买酒,要度数为v的酒,若店里没有度数为v的酒,
店主就会拿出度数高一点的酒(度数为t且t>v)卖给客人,
但有一个要求,t需要满足t-v<=Y;每输入一个客人要的酒的度数,
就输出店主卖出酒的度数,若店主没能卖出酒,就输出-1;

Input

第一行是一个T,表示样例的个数
对于每一个样例;
第一行是三个数字, N,Q and Y.
第二行有N个数字, 表示每一瓶酒的度数.
第三行有Q个数字, 表示从早上到晚上顾客要的酒的度数.
这里所有的数字在0和1,000,000之间

Output

对于每一个样例, 输出 “Case I:”, I表示样例的序号, 下面有Q行数字,
表示店主卖出酒的度数. 如果店家卖不出这样的酒,输出-1.

Sample Input
2
2 3 3
2 3
1 2 3
2 3 0
2 3
3 1 2

Sample Output
Case 1:
2
3
-1
Case 2:
3
-1
2

#include<iostream>
#include<stdio.h>
#include<set>
using namespace std;
multiset<int>s;//声明multiset
multiset<int>::iterator it;//声明一个迭代器
int main()
{
    int T;
    cin >> T;
    for (int I = 0; I < T; I++)
    {
        s.clear();
        printf("Case %d:\n", I + 1);
        int n, q, y;
        scanf("%d%d%d", &n, &q, &y);
        int t;
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &t);
            s.insert(t);
        }
        cout << *s.rend();
        while (q--)
        {
            scanf("%d", &t);
            it = s.lower_bound(t);
            if (it == s.end()||*it-t>y)//若没有比这个数大的返回s.end()
            {
                cout << "-1" << endl;
                continue;
            }
            printf("%d\n", *it);
            s.erase(it);
        }
    }
}
引用提供了一些使用set的常见操作和方法。如果要访问set中的最后一个元素,有几种方法可以实现。第一种方法是使用rbegin()函数,它返回一个指向set中最后一个元素的反向迭代器,然后可以使用*运算符来获取该元素的值。第二种方法是使用end()函数返回一个指向set末尾的迭代器,然后通过--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。第三种方法是直接使用end()函数返回的迭代器,然后使用--运算符将迭代器移动到最后一个元素,再使用*运算符获取该元素的值。提供了一个重载<运算符的示例代码。在这个示例中,定义了一个结构体node,并在结构体中重载了<运算符。通过重载<运算符,我们可以自定义set中元素的比较规则。在main函数中,创建了一个set<node>类型的集合s,并插入了一些元素。通过遍历集合s,我们可以看到集合中的元素按照我们定义的比较规则进行排序。介绍了set中lower_bound和upper_bound函数的使用。lower_bound函数返回大于或等于给定值的第一个元素的迭代器,而upper_bound函数返回大于给定值的第一个元素的迭代器。在示例代码中,首先创建了一个set<int>类型的集合s,并插入了一些元素。然后使用lower_bound和upper_bound函数分别查找给定值的边界,并输出对应的元素值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STLset详解](https://blog.csdn.net/qq_50285142/article/details/122304728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【c++STL——第八讲】set系列 (常用知识点总结)](https://blog.csdn.net/m0_63233163/article/details/124645182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值