STL算法实现 多项式加法

代码一:

#include<iostream>

#include<list>
using namespace std;
struct Point{
    int z;
    float x;
};
bool cmp(const Point & a,const Point & b) //升序,降序只需要改变大于小于符号
{
    if(a.z==b.z)
    {
        return a.z<b.z;
    }
    return a.z<b.z;
}
void print1(Point & Ele)
{
    cout<<Ele.x<<" "<<Ele.z<<endl;
}

int main()
{
    int n=4,m=3; // 1 2 2 3 3 4 4 5    1 2 3 4 4 5
    //cin>>n>>m;
    list<Point>s1;// 1 2 2 3 3 4 4 5
    list<Point>s2;//1 2 3 4 4 5
    list<Point>s3; //将合并后的链表再次将指数相同的系数相加之后的放在s3中
    for(int i=0;i<n;i++) //输入s1
    {
        //cin>>ss[i].x>>s1[i].z;
        Point aa;
        cin>>aa.x>>aa.z;
        s1.push_back(aa);
    }

    for(int i=0;i<m;i++)//输入s2
    {
        Point aa;
        cin>>aa.x>>aa.z;
        s2.push_back(aa);
    }
    
    s1.merge(s2,cmp);  //合并s1和s2,合并到s1中
    //for_each(s1.begin(),s1.end(),print1);
    list<Point>::iterator iter=s1.begin();
    Point pp;
    pp.x=(*iter).x;
    pp.z=(*iter).z;
    ++iter;
    for(;iter!=s1.end();iter++)
    {
        if(pp.z==(*iter).z)
        {
            pp.x+=(*iter).x;
            pp.z=(*iter).z;
            continue;
        }else{
            s3.push_back(pp);
            pp.x=(*iter).x;
            pp.z=(*iter).z;    
        }
    }

    s3.push_back(pp);

    list<Point>::iterator it=s3.begin();
    for(;it!=s3.end();it++)
    {
        cout<<(*it).x<<" "<<(*it).z<<endl;
    }
    return 0;

}



代码二:

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
struct Point{
    int z;
    float x;
};
void print(int & e)
{
    cout<<e<<" ";
}
void print1(Point & e)
{
    cout<<e.z<<" "<<e.x<<endl;
}
bool cmp(const Point & a,const Point &b)
{
    if(a.z==b.z)
    {
        return a.x<b.x;
    }
    return a.z<b.z;
}
int main()
{
    
    int n=4,m=3; // 1 2 2 3 3 4 4 5    1 2 3 4 4 5
    //cin>>n;
    list<Point>s1;// 1 2 2 3 3 4 4 5
    list<Point>s2;//1 2 3 4 4 5
    list<Point>s3; //将合并后的链表再次将指数相同的系数相加之后的放在s3中
    for(int i=0;i<n;i++)
    {
        //cin>>ss[i].x>>s1[i].z;
        Point aa;
        cin>>aa.x>>aa.z;
        s1.push_back(aa);
    }

    for(int i=0;i<m;i++)
    {
        Point aa;
        cin>>aa.x>>aa.z;
        s2.push_back(aa);
    }
    s1.splice(s1.end(),s2);    
    for_each(s1.begin(),s1.end(),print1);
    s1.sort(cmp);
    for_each(s1.begin(),s1.end(),print1);
    cout<<"-----------------"<<endl;
    list<Point>::iterator iter=s1.begin();
    Point pp;
    pp.x=(*iter).x;
    pp.z=(*iter).z;
    ++iter;
    for(;iter!=s1.end();iter++)
    {
        if(pp.z==(*iter).z)
        {
            pp.x+=(*iter).x;
            pp.z=(*iter).z;
            continue;
        }else{
            s3.push_back(pp);
            pp.x=(*iter).x;
            pp.z=(*iter).z;    
        }
    }
    s3.push_back(pp);
    list<Point>::iterator it=s3.begin();
    for(;it!=s3.end();it++)
    {
        cout<<(*it).x<<" "<<(*it).z<<endl;
    }
    cout<<endl;


    return 0;

}

 

//两个代码差不多,功能相同,
差别只在memry库函数和splice库函数的区别。。memey函数会自动的对合并的链表排序。。但splice可以自己想进行排序的时候再来排序,故而splice用起来更加灵活

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值