首页 > 其他分享 >[namespace hdk] 向量 direct_vector

[namespace hdk] 向量 direct_vector

时间:2024-07-13 17:52:21浏览次数:17  
标签:return int double namespace direct vector const hdk

我忏悔我有罪我心情又不好了不知道干什么所以又不小心封了个东西啊啊啊啊啊啊啊啊

功能

已重载 [] 运算符(右值)谁能教教我怎么把 [] 变成 stl 类似的左值表达式(直接返回地址需要在前面加*,挺麻烦的)
已重载 = 运算符(可使用向量或 std:::vector
已重载 + += - -= -(负号) *(点乘) *=(点乘) 运算符
已重载 == 运算符(已使用 template,operator<1>(&A) 时狭义比较(默认),否则仅比较长度)
已重载 < > <= >= (\(eps\) 意义下比较长度大小)运算符
已重载构造函数
已定义 const double pi (\(\pi\))
全局函数
anglealpha(double) 弧度制转角度值
arcalpha(double) 角度值转弧度制
以下均采用弧度制
double alpha() 返回该向量夹角
double get(int) 获取某一维的值
std::vector get_all() 将自身作为 std::vector 返回
double length() 返回向量长度
bool length_eq(&A) 比较长度是否相等(\(eps\) 意义下)
lower_degree(int) 降低向量维度后返回
upper_degree(int) 升高向量维度后返回
print(char devide=[space],char end=[\n]) 输出向量,使用 devide 做分隔符,end 做结束符
set_vector(std::vector) 使用 vector 赋值
set_basevector(double alpha) 将该向量赋值为夹角为 alpha 的单位向量
set_basevector() 夹角不变,将该向量变成单位向量
vectoralpha(&A) 求向量夹角
vectoralpha_cos(&A) 求向量夹角的余弦
*_get(int) 返回指定维度的指针
已定义 xl 作为类名称
clear()

定义

direct_vector<3> b({1,1,1});
direct_vector<3> a;
xl<2> p();

代码

#include<bits/stdc++.h>
using namespace std;
namespace hdk{
	#define xl direct_vector
	const long double pi=acos(-1);
	const long double eps=1e-5;
	inline double arcalpha(double _anglealpha){
		return _anglealpha*pi/180;
	}
	inline double anglealpha(double _arcalpha){
		return _arcalpha*180/pi;
	}
	template<int degree>
	class direct_vector{
		private:
			double d[degree+1];
		public:
			direct_vector<degree>(vector<double> x={}){
				for(int i=1;i<=degree;++i){
					if(i>(int)x.size()) d[i]=0;
					else d[i]=x[i-1];
				}
			}
			inline double *_get(int d_id){
				return &d[d_id];
			}
			inline void clear(){
				for(int i=1;i<=degree;++i){
					d[i]=0;
				}
			}
			template<bool alphatype=1>
			inline void set_basevector(double alpha){
				if(degree!=2) exit(3);
				if(alphatype==2){
					alpha=arcalpha(alpha);
				}
				d[1]=cos(alpha);
				d[2]=sin(alpha);
			}
			inline double get(int d_id){return (abs(d[d_id])<=eps?0:d[d_id]);}
			inline void set_vector(vector<double>a){
				if(a.size()<degree) exit(3);
				for(int i=1;i<=degree;++i){
					d[i]=a[i-1];
				}
			}
			void operator =(const vector<double> &A){
				if(A.size()<degree) exit(3);
				for(int i=1;i<=degree;++i){
					d[i]=A[i-1];
				}
			}
			void operator =(const direct_vector<degree> &A){
				for(int i=1;i<=degree;++i){
					d[i]=A.d[i];
				}
			}
			direct_vector<degree> operator +(const direct_vector<degree> &A)const{
				direct_vector<degree> ans;
				for(int i=1;i<=degree;++i){
					ans.d[i]=d[i]+A.d[i];
				}
				return ans;
			}
			void operator +=(const direct_vector<degree> &A){
				*this=*this+A;
			}
			direct_vector<degree> operator -()const{
				direct_vector<degree> ans;
				for(int i=1;i<=degree;++i){
					ans.d[i]=-d[i];
				}
				return ans;
			}
			direct_vector<degree> operator -(const direct_vector<degree> &A)const{
				return *this+-A;
			}
			void operator -=(const direct_vector<degree> &A){
				*this=*this+-A;
			}
			double operator *(const direct_vector<degree> &A)const{
				double ans=0;
				for(int i=1;i<=degree;++i){
					ans+=d[i]*A.d[i];
				}
				return ans;
			}
			inline vector<double> get_all(){
				vector<double> v;
				for(int i=1;i<=degree;++i){
					v.push_back(d[i]);
				}
				return v;
			}
			inline void print(char devide=' ',char end='\n'){
				for(int i=1;i<=degree;++i){
					cout<<(abs(d[i])<eps?0:d[i])<<devide;
				}
				cout<<end;
			}
			double operator [](int x){
				return get(x);
			}
			inline double length(){
				double ans=0;
				for(int i=1;i<=degree;++i){
					ans+=d[i]*d[i];
				}
				return sqrt(ans);
			}
			inline void set_basevector(){
				double len=length();
				for(int i=1;i<=degree;++i){
					d[i]/=len;
				}
			}
			direct_vector<degree> operator *(double x)const{
				direct_vector<degree> ans;
				for(int i=1;i<=degree;++i){
					ans.d[i]=x*d[i];
				}
				return ans;
			}
			void operator *=(double x){
				*this=*this*x;
			}
			template<int equaltype=1>
			bool operator ==(direct_vector<degree> A){
				if(equaltype==1){
					for(int i=1;i<=degree;++i){
						if(abs(d[i]-A.d[i])>eps) return false;
					}
					return true;
				}
				else{
					if(abs(length()-A.length())<=eps) return true;
					return false;
				}
			}
			bool operator !=(direct_vector<degree> A){
				return not(*this==A);
			}
			bool operator <(direct_vector<degree> A){
				return length()<A.length();
			}
			bool operator >(direct_vector<degree> A){
				return not((*this.operator==<2>(A)) or (*this<A));
			}
			bool operator <=(direct_vector<degree> A){
				return not(*this>A);
			}
			bool operator >=(direct_vector<degree> A){
				return not(*this<A);
			}
			template<int todegree>
			direct_vector<todegree> upper_degree(){
				direct_vector<todegree> ans;
				for(int i=1;i<=degree;++i){
					*ans._get(i)=d[i];
				}
				return ans;
			}
			template<int todegree>
			direct_vector<todegree> lower_degree(){
				direct_vector<todegree> ans;
				for(int i=1;i<=todegree;++i){
					*ans._get(i)=d[i];
				}
				return ans;
			}
			double alpha(){
				direct_vector<degree> res;
				res=*this;
				res.set_basevector();
				return acos(res[1]);
			}
			double vectoralpha_cos(direct_vector<degree> A){
				double ans=abs(*this*A)/(length()*A.length());
				return ans;
			}
			double vectoralpha(direct_vector<degree> A){
				double res=acos(vectoralpha_cos(A));
				if(abs(res)<=eps){
					return 0;
				}
				else{
					return res;
				}
			}
			bool length_eq(direct_vector<degree> A){
				return *this.operator==<2>(A);
			}
	};
}
using namespace hdk;

标签:return,int,double,namespace,direct,vector,const,hdk
From: https://www.cnblogs.com/HaneDaCafe/p/18300419

相关文章

  • C++冒泡排序(使用vector动态数组)
    #include<iostream>#include<vector>usingnamespacestd;voidsort(vector<int>&a){  constintsize=a.size();  inttemp;  intflag=1;  while(flag==1)  {  flag=0;  for(inti=0;i<size;++i)  {   if(a[i]>......
  • ECS 宝塔安装PGSQL, pgvector整合的一次记录
    前提安装宝塔面板准备好pgvector ESC>su-upostgres>psql//新建一个用户createuseraideepinwithpassword'123456';//新建一个数据库createdatabaseaideepinowneraideepin;//查看用户SELECTrolname,rolpasswordFROMpg_authid;//修改用户密码......
  • [namespace hdk] Balanced_tree 整合
    代码#include<bits/stdc++.h>usingnamespacestd;namespacehdk{ namespacebalanced_tree{ constintN=2000001,inf=114514191; classsplay{ private: introot,tot; structtree{ intw; intcnt,size; intfa,son[2]; }t[N];......
  • 支持向量机(Support Vector Machine,SVM)
    支持向量机(SupportVectorMachine,简称SVM)是一种监督学习模型,主要用于分类和回归分析。SVM的基本思想是寻找一个决策边界或超平面,使得两类样本之间的间隔最大化。这个间隔被定义为支持向量到超平面的最短距离,而支持向量就是那些恰好位于间隔边缘上的训练样本点。线性可分......
  • std::vector 中查找某个元素是否存在
    std::vector中不存在直接查找某个元素是否存在的方法,一般是通过<algorithm>中的std::find,std::find_if,std::count,std::count_if等方法的返回值来判断对应元素是否存在。如当vector中存储的元素为double类型时,需要设定其精度,判断代码如下#include<vector>#include......
  • 如何删除顽疾Terminating状态的namespace
    删除Terminating状态的namespace  话不多说,开整获取nskubectlgetnsNAMESTATUSAGEarms-promActive16dcattle-impersonation-systemTerminating13ddefaultActive......
  • [namespace hdk] ordered_vector
    功能:已重载[]运算符已重载构造函数clear()it()以std::vector形式返回自身print(char='',char='\n')输出,第一个参数为分隔符,第二个参数为结束符count(x)查找x的出现次数find(x)判断x是否出现,是返回1,否则返回0empty()判断当前是否为空size()返回当前元素个数lower......
  • Vector底层结构和代码解析
    基本介绍定义说明publicclassVector<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{Vector底层是一个对象数组,protectedObject[]elementData;Vector是线程同步的(线程安全),Vector类的操作方法带有synchronized......
  • 深入解析C++标准库中的std::vector容器
    1.底层实现std::vector 是C++标准库中的一个模版类,用于动态数组。它的底层实现可以理解为一个动态分配的连续内存块,当需要更多空间时,内存会自动扩展。内存分配:vector 使用一块连续的内存存储元素。当插入新元素导致容量不足时,vector 会分配一块更大的内存(通常是当前容量......
  • Gradle Core Plugins (plugin is not in ‘org.gradle‘ namespace)
    记录一个由gradle构建项目遇到的问题:起因:项目原先运行正常,不过个人移动了工程的目录位置,导致出现以下错误GradleCorePlugins(pluginisnotin'org.gradle'namespace)-PluginRepositories(couldnotresolvepluginartifact'com.android.application:com.androi......