重载运算符的实现与应用

重载运算符

一.背景

  在进行整数运算时,我们经常会看到整数溢出的情况。如果运算结果很大,就会用到高精度。但是高精度能否像int一样简便地使用呢?

二.一些应用

  重载运算符是借助于结构体来实现的。一般情况下为了对我们自定义的类型用sort函数进行排序,会对‘<’进行重载。然而在进行高精度是涉及到的就不仅仅是比较运算符‘<’还会涉及到赋值运算符‘>>’,‘=’,算术运算符‘+’,‘-’等。

struct   Bignum

{

     static const int mod=100000000;//这里定义了一个常量,实际上是用来做万进制优化的

  static const int length=8;   

     vector<int> s;//用来节省内存

  .......

};

三.具体实现

  1.赋值运算符:

① ‘=’的重载(一般在结构体内部

一般格式: 结构体名 operator =  (const int num(可以任意))

         或者用string赋值operator =  (const string& num(可以任意))

        需要注意的是:初始化和赋值是两种完全不同的概念,所以我们需要先在结构体内 加上:Bignum(int num=0){*this=num;}//*this是指向当前对象的指针。

        然后就是重载赋值符号:

Bignum operator = (int num)

          {

 s.clear();

 do{

  s.push_back(num%mod);

  num /= mod;

 }while(num>0);

 return *this;

}

Bignum operator = (const string& str)

{

s.clear();

int x,len=(str.length()-1)/l+1;//1为了防止有不足l位的情况。

for (int i=0;i<len;i++)

{

int t=str.length()-i*l;

int st=max(0,t-l);//防止到前面不足8

sscanf(str.substr(st,t-st).c_str(),"%d",&x);//从后向前8

s.push_back(x);

}

return *this;

}

  ‚‘<<’和‘>>’的重载(定义在结构体的外部

格式:

  ostream& operator << (ostream &out, const Bignum &x)

{

for (int i=x.s.size()-1;i>=0;i--)

     {

   cout<<x.s[i];

     }

return out;

}

istream& operator >> (istream &in,Bignum &x)

{

string s;

in>>s;

x=s;

return in;

}

2.算术运算符(一般在结构体内部)

  +:

   Bignum operator + (const Bignum& x) const

{

Bignum c;

c.s.clear();//用来存放结果的变量。

int p=0;

for (int i=0; ;i++)

{

if (p==0 && i>=s.size()&&i>=x.s.size()) break;//停止相加的判断。

int l=p;

if (i<s.size()) l+=s[i];//避免了位数不足的情况。

if (i<x.s.size()) l+=x.s[i];

c.s.push_back(l  % mod);

p=l/mod;

}

return c;

}

3.比较运算符(一般在结构体内部)

  <:

   bool operator < (const Bignum& x) const

{

if (s.size()>x.s.size()) return 0;

if (s.size()<x.s.size()) return 0;

for (int i=s.size()-1;i>=0;i--)//从后向前比较

 if (s[i]!=x.s[i]) return s[i]<x.s[i];

return false;

}    

可以用>号实现>,>=等其它运算符的重载。

四.总结

   重载运算符不只应用于高精度,还广泛应用于自定义类型的排序中(比较运算符的重载)。希望灵活使用。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>														
#include<cmath>
#include<vector> 
using namespace std;
int n,m;
struct   Bignum 
{
	static const int mod=100000000; 
	static const int l=8;
    vector<int> s;
    Bignum(int num=0){*this=num;}
	Bignum operator = (int num)
	{
		 s.clear();
		 do{
		 	s.push_back(num%mod);
		 	num /= mod;
		 }while(num>0);
		 return *this;
	}
	Bignum operator = (const string& str)
	{
		s.clear();
		int x,len=(str.length()-1)/l+1;
		for (int i=0;i<len;i++)
		{
			int t=str.length()-i*l;
			int st=max(0,t-l);
			sscanf(str.substr(st,t-st).c_str(),"%d",&x);
			s.push_back(x);
		}
		return *this;
	}
	Bignum operator + (const Bignum& x) const 
	{
		Bignum c;
		c.s.clear();
		int p=0;
		for (int i=0; ;i++)
		{
			if (p==0 && i>=s.size()&&i>=x.s.size()) break;
			int l=p;
			if (i<s.size()) l+=s[i];
			if (i<x.s.size()) l+=x.s[i];
			c.s.push_back(l  % mod);
			p=l/mod;
		}
		return c;
	}
	bool operator < (const Bignum& x) const
	{
		if (s.size()>x.s.size()) return 0;
		if (s.size()<x.s.size()) return 0;
		for (int i=s.size()-1;i>=0;i--)
		 if (s[i]!=x.s[i]) return s[i]<x.s[i];
		 return false; 
    }
}a,b;
   ostream& operator << (ostream &out, const Bignum &x)
	{
		for (int i=x.s.size()-1;i>=0;i--)
	     {
		   cout<<x.s[i]; 
	     } 
		return out;
	}
   istream& operator >> (istream &in,Bignum &x)
	{
		string s;
		in>>s;
		x=s;
		return in;
	}
long long s,s1;
string sss,sss1;
int main()
{
	cin>>a;
	cin>>b;
        if (a<b) cout<<"Y";
	return 0;
} 


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值