C++ 简单Vector模板类

刚接触类的相关内容,完成了简单的Vector模板类的项目。

用template 来实现n维向量的相关性质。

写的时候其中有几个关键的地方

1.模板类的函数定义必须和头文件放在一个cpp文件里,系统不支持模板类的单独编译。

2.定义模板类的成员(友元)函数时,都要加 template   or template

3.对于模板类的友元函数,都声明成了非约束(unbound)模板友元。  ( 详见参考blog)

4.缺陷在于没有更细致的了解模板以及没有添加异常处理等情况。


以下简单代码实现

//vector.h

#ifndef vector_h
#define vector_h
#include 
#include 
#include 
#include "vector.h"
#include
using namespace std;

template
class vector
{
	public:
       vector();
	   vector(vector &temp);
	   ~vector(){if(array !=NULL) delete array;}	
	   vector & operator=(const vector& temp);
		
       template  friend vector operator+(vector &temp1,vector &temp2);
       template  friend vector operator-(vector &temp1,vector &temp2);
	   
	   T Find(T& temp);
	   T operator*(vector &temp);
	   T norm (vector &temp);
	   
	   
       vector & unit(vector &temp);
	   
	   
       template  friend vector Vector_Cross_Product(vector &temp1,vector &temp2);
	   template  friend bool Perpendicular(vector &temp1,vector &temp2);
	   template  friend bool Parallel(vector &temp1,vector &temp2);
	   template  friend ostream & operator<<(ostream &out, const vector &temp);
	   template  friend istream & operator>>(istream &in,vector &temp);
	   
	protected:
		T *array;
		int len;
		int sum;
};

//0.默认构造函数
template 
vector::vector()
{
   if(len==0)
	   array=NULL;
}


//1.拷贝构造函数 
template 
vector :: vector(vector &temp){
	len=temp.len;
	array= new T[len];
	for(int i=0;i<=len;i++)
	   array[i]=temp.array[i];
}

//2.向量的赋值
template
vector & vector :: operator=(const vector &temp){
	len=temp.len;
	array=new T[len];
	for(int i=0;i<=len;i++)
	{
		array[i]=temp.array[i];
	};
	return *this;
}

//3.在向量中查找某个分向量的位置
template
T vector:: Find(T& temp){
 	 for(int i=0;i<=len;i++)
		if(array[i]==temp)
			return i;
	 return -1;
}

//4.向量的加法
template
vector operator+(vector &temp1,vector &temp2){
	vector temp;
	temp.len=temp1.len;
	temp.array=new T[temp.len];
	for(int i=0;i<=temp1.len;i++)
		temp.array[i]=temp1.array[i]+temp2.array[i];
	return temp;
}

//5.向量的减法
template
vector operator-(vector &temp1,vector &temp2){
	vector temp;
	temp.len=temp1.len;
	temp.array=new T[temp.len];
	for(int i=0;i
T vector :: operator * (vector &temp){
    len=temp.len;
    sum=0;
	for(int i=0;i
T vector :: norm(vector &temp){
	 len=temp.len;
	 sum=0;
	 for(int i=0;i
vector & vector :: unit(vector &temp1){
	 vector temp;
 	 temp.len=temp1.len;
	 temp.array=new T[temp1.len];
	 T total=temp1.norm(temp1);	 
 	 for(int i=0;i
vector Vector_Cross_Product(vector &temp1,vector &temp2){
	 vector temp;
	 temp.len=temp1.len;
	 temp.array=new T[temp.len];
     if(temp.len==3)
     {
    	temp.array[0]=temp1.array[1]*temp2.array[2]-temp1.array[2]*temp2.array[1];
     	temp.array[1]=temp1.array[2]*temp2.array[0]-temp1.array[0]*temp2.array[2];
     	temp.array[2]=temp1.array[0]*temp2.array[1]-temp1.array[1]*temp2.array[0];
	 }
	 return temp; 
}


//10.判断向量垂直
template
bool Perpendicular(vector &temp1,vector &temp2){
	  int ans=0;
	  for(int i=0;i
bool Parallel(vector &temp1,vector &temp2){
      int flag=1;
	  for(int j=0;j
ostream & operator<<(ostream &out, const vector &temp){
	for(int i=0;i
istream & operator>>(istream &in,vector &temp){
    cout<<"请输入维数:"<>temp.len;
    cout<<"Please input the array: "<>temp.array[i];
	return in;
}

#endif



//test_vector.cpp

#include 
#include 
#include 
#include 
#include 
#include "vector.h"
const int maxn=1e5+5;
using namespace std;

/*
测试:
0.构造函数,拷贝构造函数
1. I/O操作 
2.向量的赋值
3.查找向量分量位置 
4.向量的加法
5.向量的减法
6.向量的点积
7.向量的模
8.向量的单位化
9.向量的叉积
10.判断向量垂直
11.判断向量平行 
*/

void test1(){
	cout<<"Please input integer vector"<v;
	cin>>v;
	cout<v1;
	cin>>v1;
	cout<v2;
	cin>>v2;
	cout<v;
	cin>>v;
	vectorv2;
	v2=v;
	cout<<"赋值Vector_2为Vector_1:  Vector_2= "<v;
	cin>>v;
	cout<<"请输入想要查找的数"<>n;
	cout<<"位置为:"<v1,v2;
	cout<<"请分别输入两个向量"<>v1>>v2;
	cout<<"两个向量的和为:"<v1,v2;
	cout<<"请分别输入两个向量"<>v1>>v2;
	cout<<"两个向量的差为:"<v1,v2;
	cout<<"请输入两个向量"<>v1>>v2;
	cout<<"两个向量的点积为:"<v;
	cout<<"输入一个向量:"<>v;
	cout<<"向量的模为:"<v1,v2;
	cout<<"请输入一个向量:"<>v1;
	v2=v1.unit(v1);
//	cout<<"向量的单位向量为:"<v1,v2,v3;
	cout<<"请输入两个三维向量:"<>v1>>v2;
    v3=Vector_Cross_Product(v1,v2);
	cout<<"两个向量的叉积为:"<v1,v2;
	cout<<"请输入两个向量:"<>v1>>v2;
	if(Perpendicular(v1,v2))
        cout<<"两个向量垂直"<v1,v2;
	cout<<"请输入两个向量:"<>v1>>v2;
	if(Parallel(v1,v2))
        cout<<"两个向量平行"<>choice;
		if(choice <= 0) break;
		if(choice <= n) f[choice-1]();
	}
	return 0;
}





参考资料:

http://blog.csdn.net/typecool/article/details/5843208

你可能感兴趣的:(C++,Class,Project)