ACM模板(7)vector的计算

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

//枚举2个vector的两数之和

//判断2个vector是否全等

//二维数组去掉重复行

//删除二维vector中,含有重复元素的行

//二维数组每一行排序

//判断有序数组中有多少个不同的数

//收缩计数,把[1 4 1 4 4]变成[(1,2)(4,3)]

//枚举2个vector的两数之和
template<typename T>
vector<T> everySum(vector<T>&v1,vector<T>&v2)
{
    vector<T>ans;
    ans.resize(v1.size()*v2.size());
    int k=0;
    for(int i=0;i<v1.size();i++)for(int j=0;j<v2.size();j++)ans[k++]=v1[i]+v2[j];
    return ans;
}
//判断2个vector是否全等
template<typename T>
bool isSame(vector<T>&v1,vector<T>&v2)
{
    if(v1.size()-v2.size())return false;
    for(int i=0;i<v1.size();i++)if(v1[i]!=v2[i])return false;
    return true;
}
//二维数组去掉重复行
template<typename T>
vector<vector<T>> deleteSameLine(vector<vector<T>>&v)
{
    vector<vector<T>>ans;
    ans.reserve(v.size());
    for(int i=0;i<v.size();i++)
    {
        for(int j=i+1;j<v.size();j++)if(isSame(v[i],v[j]))goto deleteSameLineHere;
        ans.push_back(v[i]);
deleteSameLineHere:;
    }
    return ans;
}
//删除二维vector中,含有重复元素的行
template<typename T>
vector<vector<T>> deleteSame(vector<vector<T>>&v)
{
    vector<vector<int>>ans;
    ans.reserve(v.size());
    for(int i=0;i<v.size();i++)
    {
        for(int j=0;j<v[i].size();j++)for(int k=j+1;k<v[i].size();k++)if(v[i][j]==v[i][k])goto deleteSameHere;
        ans.push_back(v[i]);
deleteSameHere:;
    }
    return ans;
}
//二维数组每一行排序
template<typename T>
vector<vector<T>> sort2(vector<vector<T>>&v)
{
    for(int i=0;i<v.size();i++)sort(v[i].begin(),v[i].end());
    return v;
}
//判断有序数组中有多少个不同的数
template<typename T>//T可以是指针或迭代器,统计范围是[left,right)
int getDifNum(T left,T right)
{
    if(left==right)return 0;
    int ans=1;
    for(T it=left+1;it!=right;it++)ans+=*it!=*(it-1);
    return ans;
}
template<typename T>
int getDifNum(vector<T>v)
{
    return getDifNum(v.begin(),v.end());
}
//收缩计数,把[1 4 1 4 4]变成[(1,2)(4,3)]
template<typename T>
vector<pair<T,int>> fshr(vector<T>v)
{
    vector<pair<T,int>>ans;
    if(v.size()==0)return ans;
    sort(v.begin(),v.end());
    ans.resize(getDifNum(v));
    ans[0]=make_pair(v[0],1);
    for(int i=1,j=0;i<v.size();i++)
    {
        if(v[i]==v[i-1])ans[j].second++;
        else ans[++j]=make_pair(v[i],1);
    }
    return ans;
}

猜你喜欢

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