ACM模板(1)vector操作

ACM模板列表 https://blog.csdn.net/nameofcsdn/article/details/107235360

(1)常用操作

//翻转vector

//翻转二维vector的每一行

//vector乘一个数

//vector加一个数

//id处,覆盖或者添加x

//2个vector拼接起来

//把vector自复制一份,前后拼接起来

//翻转vector
template
vector frev(vector &v)
{
    vector ans;
    ans.resize(v.size());
    for(int i=0;i
vector> frev(vector> &v)
{
    vector>ans;
    for(int i=0;i
void fcheng(vector &v,T2 n)
{
    for(int i=v.size()-1;i>=0;i--)v[i]*=n;
}
//vector加一个数
template
void fjia(vector &v,T2 n)
{
    for(int i=v.size()-1;i>=0;i--)v[i]+=n;
}
//id处,覆盖或者添加x
template
void finsert(vector&v,int id,T x)
{
    if(id<0||id>v.size())return;
    if(id==v.size())v.push_back(x);
    v[id]=x;
}
//2个vector拼接起来
template
vector join(vector&v1,vector&v2)
{
    vectorans(v1.size()+v2.size());
    copy(v1.begin(),v1.end(),ans.begin());
    copy(v2.begin(),v2.end(),ans.begin()+v1.size());
    return ans;
}
//把vector自复制一份,前后拼接起来
template
vectorselfCopy(vector&v)
{
    return join(v,v);
}

 

(2)寻找vector每个数前面最近的满足可自定义关系的数

注意:需要把上面的代码带上

//返回vector每个数前面最近的满足pr关系的数的ID,-1 或者 0到size-1

//(4个函数)寻找每个元素前面最近的比它小、小于等于、大、大于等于的数的ID,-1 或者 0到size-1

//(4个函数)寻找每个元素后面最近的比它小、小于等于、大、大于等于的数的ID,size 或者 0到size-1

使用方法:如果vector里面的数有小于运算,即可直接使用,比如整数、char、double、string类等等

如果没有,需要在fminlef 或fminlef2 函数中换上自定义的比较函数,比如结构体,这其实和sort函数是类似的。

//返回vector每个数前面最近的满足pr关系的数的ID,-1 或者 0到size-1
templateinline
vectorfirstInLeft(vectorv,P pr)
{
    vector ans;
    if(v.size()==0)return ans;
    stackst;
    st.push(0);
    ans.push_back(-1);
    for(int i=1;i
vector fminlef(vector v)
{
    return firstInLeft(v,[](T a,T b){return a
vector fminlef2(vector v)
{
    return firstInLeft(v,[](T a,T b){return a<=b;});  //可换为自定义函数
}
//返回vector每个数前面最近的比它大的数的ID,-1 或者 0到size-1
template
vector fmaxlef(vector v)
{
    fcheng(v,-1);
    vectorans=fminlef(v);
    return ans;
}
//返回vector每个数前面最近的比它大或等于的数的ID,-1 或者 0到size-1
template
vector fmaxlef2(vector v)
{
    fcheng(v,-1);
    vectorans=fminlef2(v);
    return ans;
}


//返回vector每个数后面最近的比它小的数的ID,size 或者 0到size-1
template
vector fminrig(vector v)
{
    vectorv1=frev(v),v2=fminlef(v1);
    fcheng(v2,-1);
    fjia(v2,v.size()-1);
    return frev(v2);
}
//返回vector每个数后面最近的比它小或等于的数的ID,size 或者 0到size-1
template
vector fminrig2(vector v)
{
    vectorv1=frev(v),v2=fminlef2(v1);
    fcheng(v2,-1);
    fjia(v2,v.size()-1);
    return frev(v2);
}
//返回vector每个数后面最近的比它大的数的ID,size 或者 0到size-1
template
vector fmaxrig(vector v)
{
    vectorv1=frev(v),v2=fmaxlef(v1);
    fcheng(v2,-1);
    fjia(v2,v.size()-1);
    return frev(v2);
}
//返回vector每个数后面最近的比它大或等于的数的ID,size 或者 0到size-1
template
vector fmaxrig2(vector v)
{
    vectorv1=frev(v),v2=fmaxlef2(v1);
    fcheng(v2,-1);
    fjia(v2,v.size()-1);
    return frev(v2);
}

PS:代码用单调栈实现,时间复杂度为O(n)

 

你可能感兴趣的:(ACM模板(1)vector操作)