C++単純Vectorテンプレートクラス


クラスの関連内容に触れたばかりで、簡単なVectorテンプレートクラスのプロジェクトが完成しました.
n次元ベクトルの相関特性をtemplateで実現した.
書くときに重要な点がいくつかあります
1.テンプレートクラスの関数定義はヘッダファイルと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< &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< &temp){
	for(int i=0;i
istream & operator>>(istream &in,vector &temp){
    cout<>temp.len;
    cout<>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<v;
	cin>>v;
	cout<v1;
	cin>>v1;
	cout<v2;
	cin>>v2;
	cout<v;
	cin>>v;
	vectorv2;
	v2=v;
	cout<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