ACM模板(8)Vector的拆分拼接、交叉交换、字典序排序

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

//把v分成前面k个和后面的v.size()-k个,返回拆出来的后面的数组,v本身只留k个

//2个vector拼接起来

//交叉交换,v1分成前面k1个和后面的v1.size()-k1个,v2同理,交换后面的2段

//把v分成前面k个和后面的v.size()-k个,返回拆出来的后面的数组,v本身只留k个
template<typename T>
vector<T> fchai(vector<T>&v,int k)
{
    vector<T>v2;
    v2.resize(v.size()-k);
    copy(v.begin()+k,v.end(),v2.begin());
    v.resize(k);
    return v2;
}
//2个vector拼接起来
template<typename T>
vector<T> join(vector<T>&v1,vector<T>&v2)
{
    vector<T>ans(v1.size()+v2.size());
    copy(v1.begin(),v1.end(),ans.begin());
    copy(v2.begin(),v2.end(),ans.begin()+v1.size());
    return ans;
}
//交叉交换,v1分成前面k1个和后面的v1.size()-k1个,v2同理,交换后面的2段
template<typename T>
void change(vector<T>&v1,vector<T>&v2,int k1,int k2)
{
    vector<T>v3=fchai(v1,k1),v4=fchai(v2,k2);
    v1=join(v1,v4),v2=join(v2,v3);
}

//vector的字典序比较,v1<v2是true,v1>=v2是false

//vector的字典序排序

//vector的字典序比较,v1<v2是true,v1>=v2是false
template<typename T>
bool cmp(vector<T>&v1,vector<T>&v2)
{
    for(int i=0;i<v1.size()&&i<v2.size();i++)
    {
        if(v1[i]!=v2[i])return v1[i]<v2[i];
    }
    return v1.size()<v2.size();
}
//vector的字典序排序
template<typename T>
void sortVector(vector<vector<T>>&v)
{
    sort(v.begin(),v.end(),cmp<T>);
}

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/107536237