模板:<bits/_Complex.h>

本文分享了一个用于快速傅立叶变换的手写复数类模板,对比系统自带的complex类,该模板在性能上表现更优。文章详细介绍了模板的使用方法及各种运算符的重载实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作死去学了FFT。。。

系统自带的complex真是慢。。。比手写的慢了整整0.8s。。。于是果断手写了一发Complex的模板。。。。

原型:

template<typename T>class Complex;

使用方法:

using namespace PoPoQQQ_Complex;
	Complex<double> x;cin>>x;
	x+=Complex<double>(1,0);
	x-=Complex<double>(0,1);
	x*=Complex<double>(2,3);
	x/=Complex<double>(2);
	if( x==Complex<double>(3.500000003,2) )//重载==与!=,自带精度判断 
		cout<<x<<endl;
	cout<<Abs(x)<<endl;//模值 
	cout<<Arg(x)<<endl;//极角
	cout<<Norm(x)<<endl;//模值的平方
	cout<<Conj(x)<<endl;//共轭复数
	cout<<Exp(x)<<endl;//自然对数
	cout<<Log(x)<<endl;//自然对数底的对数
	cout<<Pow(x,10)<<endl;//幂
	cout<<Sqrt(x)<<endl;//平方根 

代码:

//writen by PoPoQQQ
//not finished yet
#define _COMPLEX_

#ifndef _MATH_
#include<cmath>
#endif

#ifndef _GLIBCXX_IOSTREAM
#include<iostream>
#endif

#ifndef EPS
#define EPS 1e-7
#endif

namespace PoPoQQQ_Complex{
	using namespace std;
	template<typename T>class Complex{
	public:
		T real,imaginary;
		Complex() {}
		Complex(T _,T __=0.0):real(_),imaginary(__) {}
		Complex& operator += (const Complex<T> &x) { real+=x.real;imaginary+=x.imaginary;return *this; }
		Complex& operator -= (const Complex<T> &x) { real-=x.real;imaginary-=x.imaginary;return *this; }
		Complex& operator *= (const T &x) { real*=x;imaginary*=x;return *this; }
		Complex& operator /= (const T &x) { real/=x;imaginary/=x;return *this; }
		friend Complex operator + (const Complex<T> &x,const Complex<T> &y) { Complex re=x;re+=y;return re; }
		friend Complex operator - (const Complex<T> &x,const Complex<T> &y) { Complex re=x;re-=y;return re; }
		friend Complex operator * (const Complex<T> &x,const T y) { Complex re=x;re*=y;return re; }
		friend Complex operator / (const Complex<T> &x,const T y) { Complex re=x;re/=y;return re; }
		friend Complex operator * (const Complex<T> &x,const Complex<T> &y)
		{ return Complex(x.real*y.real-x.imaginary*y.imaginary,x.real*y.imaginary+x.imaginary*y.real); }
		friend Complex operator / (const Complex<T> &x,const Complex<T> &y)
		{ return x*Complex(y.real,-y.imaginary)/(y.real*y.real+y.imaginary*y.imaginary); }
		Complex& operator *= (const Complex &x) { return *this=(*this)*x; }
		Complex& operator /= (const Complex &x) { return *this=(*this)/x; }
		bool operator == (const Complex &x) { return fabs(real-x.real)<EPS && fabs(imaginary-x.imaginary)<EPS; }
		bool operator != (const Complex &x) { return fabs(real-x.real)>EPS || fabs(imaginary-x.imaginary)>EPS; }
		friend istream& operator >> (istream& _is,Complex &x) { _is>>x.real>>x.imaginary;return _is; }
		friend ostream& operator << (ostream& _os,const Complex &x) { _os<<'('<<x.real<<','<<x.imaginary<<')';return _os; }
		friend T Abs(const Complex<T> &x) { return sqrt(x.real*x.real+x.imaginary*x.imaginary); }
		friend T Arg(const Complex<T> &x) { return atan2(x.imaginary,x.real); }
		friend T Norm(const Complex<T> &x) { return x.real*x.real+x.imaginary*x.imaginary; }
		friend Complex<T> Conj(const Complex<T> &x) { return Complex(x.real,-x.imaginary); }
		friend Complex<T> Exp(const Complex<T> &x) { return exp(x.real)*Complex<T>(cos(x.imaginary),sin(x.imaginary)); }
		friend Complex<T> Log(const Complex<T> &x) { return Complex<T>(log(Norm(x))/2.0,atan2(x.imaginary,x.real)); }
		friend Complex<T> Pow(const Complex<T> &x,const T y) { return Exp(y*Log(x)); }
		friend Complex<T> Sqrt(const Complex<T> &x) { return Pow(x,0.5); }
	};
}


``` class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end()); // 升序 vector<int> res; int n = intervals.size(); int start = intervals[0][0]; int end = intervals[0][1]; for (int i = 1; i < n; i++) { if (intervals[i][0] <= end) { // 重叠,合并 end = intervals[i][1]; } else { // 不重叠,加入结果数组 res.emplace_back(start, end); start = intervals[i][0]; end = intervals[i][1]; } } // 最后一个区间 res.emplace_back(start, end); return res; } };```In file included from prog_joined.cpp:1: In file included from ./precompiled/headers.h:25: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ccomplex:39: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/complex:45: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/sstream:40: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/istream:40: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ios:44: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/ios_base.h:41: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/locale_classes.h:40: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/string:54: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/basic_string.h:39: In file included from /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/ext/alloc_traits.h:34: /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/alloc_traits.h:536:4: error: no matching function for call to 'construct_at' 527 | std::construct_at(__p, std::forward<_Args>(__args)...); | ^~~~~~~~~~~~~~~~~ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/vector.tcc:117:21: note: in instantiation of function template specialization 'std::allocator_traits<std::allocator<int>>::construct<int, int &, int &>' requested here 108 | _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish, | ^ Line 15: Char 21: note: in instantiation of function template specialization 'std::vector<int>::emplace_back<int &, int &>' requested here 15 | res.emplace_back(start, end); | ^ /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/stl_construct.h:94:5: note: candidate template ignored: substitution failure [with _Tp = int, _Args = <int &, int &>]: excess elements in scalar initializer 85 | construct_at(_Tp* __location, _Args&&... __args) | ^ 86 | noexcept(noexcept(::new((void*)0) _Tp(std::declval<_Args>()...))) 87 | -> decltype(::new((void*)0) _Tp(std::declval<_Args>()...)) | ~~~
04-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值