C++単純Vectorテンプレートクラス
クラスの関連内容に触れたばかりで、簡単なVectorテンプレートクラスのプロジェクトが完成しました.
n次元ベクトルの相関特性をtemplateで実現した.
書くときに重要な点がいくつかあります
1.テンプレートクラスの関数定義はヘッダファイルと1つのcppファイルに入れなければならない.システムはテンプレートクラスの単独コンパイルをサポートしない.
2.テンプレートクラスのメンバー(友元)関数を定義する場合は、template or templateを追加します.
3.テンプレートクラスの友元関数については、非拘束(unbound)テンプレート友元として宣言されます.(詳細はblog参照)
4.欠点は、テンプレートをより細かく理解していないことや、異常処理を追加していないことなどです.
以下の単純なコード実装
参考資料:
http://blog.csdn.net/typecool/article/details/5843208
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