(Day2)常用stl

wlqtc發表於2024-06-25
  • vector:

用法:

sort(ve.begin(),ve.end());//排序

ve.push_back();//末尾插入

ve.pop_back();//末尾刪除

ve.insert(v.begin(),x);//在最頭插入x

ve.insert(v.begin()+2,x);//在第二個元素前插入x

ve.erase(ve.begin());//裡面是迭代器,刪除相應的
  • string
getline(cin,s);//整行讀入

s.insert(pos,s1);

s.erase(pos,num);

s.substr(pos,num);

s1.find(s2,pos);
  • pair
pair<>//C艹內建的二元組 用make_pair函式建立
  • queue
priority_queue<int>qu;//優先佇列

priority_queue<pair< , >>qu;

priority_queue<int,vector<int>,greater<int> >qu;

qu.back();//取隊尾元素
  • 雙端佇列deque
#include<dequeue>//標頭檔案

deque<int>qu;

qu.front();

qu.back();

qu.push_back();

qu.push_front();

qu.pop_front();

qu.pop_back();
  • set
s.find(x);//找到一樣的數字,並返回地址

s.lower_bound(x);//<x的元素

s.upper_bound(x);//>=x的元素

s.erase(it);//刪除迭代器指向的元素

s.erase(x);//刪除等於x的元素

s.count(x);//返回等於x的個數

s.erase(s.find(2),s.find(4));//刪除區間
  • map
mp.find(x);//查詢key為x的元素

mp.insert(make_pair(2,3))

map<char,int>::iterator it;//迭代器

不去重

宣告時使用multi+set/map宣告不去重set/map,使用方法與set/map類似

multiset<int>s;

multiset<int>::iterator it;
  • bitset
#include<bitset>

bitset<10000>s;//10000位的二進位制數

s[k]取第k位

s.count();//數有幾位

s.any();//只要有一個1就返回true

s.none();//必須全為0才返回true

s.set();//所有位都變為1

s.flip();//所有位置取反

//前幾個函式如果裡面加上x,就是表示只作用於第幾位
  • sort
struct node
{
  int x,y;
};
vector<node>ve;
bool operator<(const node &a,const node &b)
{
  return a.x<b.x;
}
sort(ve.begin(),ve.end());

  • 二分
upper_bound();//>=x

lower_bound();//<x
  • 其他
#incude<algorithm>

reverse(a.begin(),a.end());//翻轉

reverse(a+1,a+1+n);

int m=unique(a.begin(),a.end())-a.begin();//返回個

next_permutation(a+1,a+1+n);
  • 查詢
lower_bound(first,last,value);

upper_bound(first,last,value);

在有序陣列[first,last)中查詢第一個

不大於/不小於val的元素地址

題目:洛谷P1168

https://www.luogu.com.cn/problem/P1168

題目大意:

輸出前1,前3,前5....數的中位數

思路:

開始想著用優先佇列,但是優先佇列好像不好把中間的數輸出,然後就學到了ve的另一個用法,把數插入到中間去,用二分返回插入的位置,然後直接把需要的數輸出就行了。

AC程式碼:

#include<bits/stdc++.h>
using namespace std;
vector<int>ve;
int main()
{
  int n;
  scanf("%d",&n);
  int x;
  for(int i=1;i<=n;i++)
  {
  		scanf("%d",&x);
    	ve.insert(upper_bound(ve.begin(),ve.end(),x),x);
    	if(i%2==1)cout<<ve[(i-1)/2]<<endl;
  }
  return 0;
}