Vector的下标和数组一样从0开始的
\(vector<int>vec\)
\(vec.size();\) //返回向量的实际大小
$vec.begin(); $//返回向量的开始指针的位置
\(vec.end();\) //返回向量的结束指针的下一个位置
\(vec.push\_back(x);\) //在对象末尾插入数据x
\(vec.pop\_back();\) //在对象末尾删除数据
\(vec.clear();\) //清除对象中的所有数据
\(vec.at(i);\) //访问容器中第i个数的值或\(vec[i]\)
在第\(i+1\)个数前面插入一个数\(x:vec.insert(vec.begin()+i,x)\)
删除第\(i+1\)个数\(:vec.erase(vec.begin()+i)\)
#include<algorithm>
lower_bound(); upper_bound(); unique();//判重
lower_bound(a + 1,a + n + 1,x);//在begin到end-1二分查找有序表中第一个大于等于x的数的位置
//仅适用于非降序的有序表,如果是非升序的有序表,则需要重载:
lower_bound(a+1,a+n+1,x,greater<int>());
int t=lower_bound(a+1,a+n+1,x)-a;//在begin到end-1查找第一个大于等于x的数的位置,返回值是地址 if(a[t]==x) //如果这个数==x
printf("%d\n",t);
upper_bound(a+1,a+n+1,x)-a;//二分查找有序表中第一个大于x的数的位置,仅适用于非降序的有序表
int k=unique(a+1,a+n+1)-a;//得到有效长度,去重
for(int i=1;i<=k;i++) //只输出有效长度
printf("%d ",a[i]);
P3369普通平衡树
操作:插入\(x\),删除\(x\),查询\(x\)排名\((\)比当前小的数\(+1)\),查询排名\(x\)数,\(x\)前驱\((小于x且最大)\),\(x\)后继\((大于x,且最小)\)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v;
int n,opt,x;
int main()
{
v.reserve(100001);
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&opt,&x);
if(opt==1) v.insert(lower_bound(v.begin(),v.end(),x),x);
if(opt==2) v.erase (lower_bound(v.begin(),v.end(),x));
if(opt==3) printf("%d\n",lower_bound(v.begin(),v.end(),x)-v.begin()+1);
if(opt==4) printf("%d\n",v[x-1]);
if(opt==5) printf("%d\n",v[lower_bound(v.begin(),v.end(),x)-v.begin()-1]);
if(opt==6) printf("%d\n",v[upper_bound(v.begin(),v.end(),x)-v.begin()]);
}
return 0;
}