?1、set常用操作
set<int> q; //以int型為例 默認按鍵值升序
set<int,greater<int>> p; //降序排列
int x;
q.insert(x); //將x插入q中
q.erase(x); //刪除q中的x元素,返回0或1,0表示set中不存在x
q.clear(); //清空q
q.empty(); //判斷q是否為空,若是返回1,否則返回0
q.size(); //返回q中元素的個數
q.find(x); //在q中查找x,返回x的迭代器,若x不存在,則返回指向q尾部的迭代器即 q.end()
q.lower_bound(x); //返回一個迭代器,指向第一個鍵值不小于x的元素
q.upper_bound(x); //返回一個迭代器,指向第一個鍵值大于x的元素q.rend(); //返回第一個元素的的前一個元素迭代器
q.begin(); //返回指向q中第一個元素的迭代器q.end(); //返回指向q最后一個元素下一個位置的迭代器
q.rbegin(); //返回最后一個元素
2、set單元素應用
#include<iostream>
#include<set>
using namespace std;
int main()
{set<int> q; //默認按升序排列 q.insert(5);q.insert(5);q.insert(5);cout<<"q.size "<<q.size()<<endl; //輸出 1 ,在set插入中相同元素只會存在一個q.clear(); //清空setcout<<"q.size "<<q.size()<<"\n\n";q.insert(4);q.insert(4);q.insert(3);q.insert(3); q.insert(2);q.insert(1);cout<<"lower_bound "<<*q.lower_bound(3)<<endl; //返回3 cout<<"upper_bound "<<*q.upper_bound(3)<<"\n\n"; //返回4 set<int>::iterator i;for( i=q.begin();i!=q.end();i++) //set的遍歷 cout<<*i<<" "; //輸出1 2 3 4,可見自動按鍵值排序 cout<<endl;q.erase(4); //刪除q中的 4 for(i=q.begin();i!=q.end();i++) //再次遍歷set 只輸出 1 2 3 cout<<*i<<" ";cout<<"\n\n"; set<int,greater<int>> p; //降序排列 p.insert(1);p.insert(2);p.insert(3);p.insert(4);p.insert(5);for(i=p.begin();i!=p.end();i++)cout<<*i<<" ";cout<<endl;return 0;
}
?3、set的應用
?E-種類數_牛客小白月賽117
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<ll> s; // 使用集合來存儲數組中的非零元素,集合會自動排序
bool exist0 = 0; // 標記數組中是否存在0
int main() {ll ans = 0; // 記錄操作輪數ll dec = 0; // 記錄已經減去的總和ll n;cin >> n;while (n--) {ll temp;cin >> temp;if (temp != 0) s.insert(temp); // 將非零元素插入集合else exist0 = 1; // 如果有0,標記exist0為1}// 如果集合中只有一個元素且沒有0,說明已經所有數相同,不需要操作if (s.size() == 1 && !exist0) {cout << 0 << endl;return 0;}// 當集合中還有元素時,繼續操作while (s.size()) {ll num = *s.begin() - dec; // 獲取當前最小的非零元素,減去已經減去的總和ll cnt = exist0 ? s.size() + 1 : s.size(); // 如果存在0,種類數為集合大小加1,否則為集合大小ll t = (num + cnt - 1) / cnt; // 計算需要減去的次數,向上取整dec += t * cnt; // 更新已經減去的總和ans += t; // 增加操作輪數s.erase(*s.begin()); // 移除當前最小的元素exist0 = 1; // 標記存在0}cout << ans << endl;return 0;
}