N维整型向量类

Posted luoqingci

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了N维整型向量类相关的知识,希望对你有一定的参考价值。

一、问题描述。

线性代数里面我们学习过n维向量,请用类vector_N来封装n维整型向量,成员如下;

私有数据成员:

²  向量维数n, int型

²  指针 p,int型

公有函数成员:

  • 无参默认构造函数,在该函数中,将n置0,将p置null;
  • 重载输入输出运算符,输入运算符,先指定向量维数,若输入为非正整数,则提示错误信息,“Error Length!”然后退出程序,若维数输入正确则分配长度为n的动态内存,并用指针p指向该内存,输出运算符依次输出向量各元素即可;
  • 重载向量的加法+、减法-、数乘*(乘数在前,乘数为int型)这三运算符;
  • 重载[]运算,例如,向量a=(1,2,3,4),a[0]的值为1,若下标越界,则输出“Error Index”,然后退出程序;
  • 返回向量维数的函数;
  • 将两个向量的内积运算定义为vector_N的友元函数;

在主函数中定义两个vector_N类对象v1,v2,均不带参数,之后对两个对象进行输入赋值,输入数乘运算的乘数,输入待取元素的下标,对两个向量进行加、减、数乘和内积运算,并将结果输出,输出v1中对应下标对应的元素。加法、减法和内积运算先判断两向量维数是否一致,若一致则输出运算结果,否则输出错误提示信息“Mismatch Length!”

二、设计思路。

1.此类需要用到动态内存的分配,所以在析构函数中应释放空间,并将指针置null,将维数n置0 

2.需要显式定义复制构造函数vector_N(vector_N &)

3.需要重载复制运算符 vector_N operator= (vector_N &)

4.退出程序用函数 _exit(0)

5.返回值类型需要为引用的形式,另一方面,在使用时就要考虑不能返回临时变量的引用

三、程序流程图。

 

四、代码实现。

#include<iostream>

#include <cmath>

#include <string>

using namespace std;

class vector_N

private:

    int n;

    int *p;

public:

    vector_N(int nn = 0, int *pp = NULL);

    vector_N(vector_N& p);

    friend istream& operator>>(istream& input, vector_N& N);

    friend ostream& operator<<(ostream& output, vector_N& N);

    vector_N operator+(vector_N B);

    vector_N operator-(vector_N B);

    float operator*(vector_N B);

    vector_N operator*(int B);

    float operator[](int b);

    bool check(vector_N B);

 

 

;

vector_N:: vector_N(int nn, int *pp ) : n(nn), p(pp)

vector_N::vector_N(vector_N& pp)

    n = pp.n;

    p = pp.p;

bool vector_N:: check(vector_N B)

    if (n != B.n)

         cout << "Mismatch Length!" << endl;

         return false;

   

    else

         return true;

   

vector_N vector_N:: operator+(vector_N A)

    vector_N sum(A);

    if (check(A))

   

         for (int i = 0; i < A.n; i++)

        

             sum.p[i] = p[i] + A.p[i];

        

         return sum;

   

    else

   

         exit(0);

   

   

vector_N vector_N:: operator-(vector_N B)

    vector_N sum(B);

    if (check(B))

   

         for (int i = 0; i < B.n; i++)

        

             sum.p[i] = this->p[i] - B.p[i];

        

         return sum;

   

    else

   

         exit(0);

   

    float vector_N:: operator*(vector_N B)

   

         vector_N sum(B);

         float sum1 = 0;

         if (check(B))

        

             for (int i = 0; i < B.n; i++)

            

                  sum.p[i] = p[i] * B.p[i];

                  sum1 += sum.p[i];

            

             return sum1;

        

         else

        

             exit(0);

        

   

    vector_N vector_N:: operator*(int B)

   

         vector_N re(n,p);

         for (int i = 0; i < n; i++)

        

             re.p[i] = p[i] * n;

        

         return re;

   

    float vector_N:: operator[](int b)

   

         return p[b];

   

 

 

istream& operator>>(istream& input, vector_N& N)

    input >> N.n;

    if (N.n <= 0)

         cout << "Error Lenth!" << endl;

         exit(0);

   

    else

         N.p = new int[N.n];

         for (int i = 0; i < N.n; i++)

        

             input >> N.p[i];

        

   

 

ostream& operator<<(ostream& output, vector_N& N)

    for (int i = 0; i < N.n; i++)

   

         if (i == 0) output << "(";

         output << N.p[i];

         if (i != N.n - 1)

             output << ",";

         if (i == N.n-1) output << ")"<<endl;

   

    return output;

 

int main()

    vector_N a, b, c; int w,e;

    cin >> a;

    cin.sync();

    cin >> b;

    cout << "请输入数乘的乘数" << endl;

    cin >> w;

    cin.sync();

    cout << "请输入待取元素下标" << endl;

    cin >> e;

    cout << "v1+v2=" << a + b << endl;

    cout << "v1-v2=" << a - b << endl;

    cout << "v1*v2=" << a*b << endl;

    cout << "v1数乘结果为" << a*w << endl;

    cout << "v1的结果为:" << a[e] << endl;

 

设计一个三维向量类,并实现向量的加法,减法以及向量与标量的乘法和除法运算

class Vecter3:
    def_init_(self,x=0,y=0,z=0):
              self.X=x
              self.Y=y
              self.Z=z
    def_add_(self,n):
              r=Vecter3()
              r.X=self.X+n.X
              r.Y=self.Y+n.Y
              r.Z=self.Z+n.Z
              return r
    def_sub_(self,n):
              r=Vecter3()
              r.X=self.X-n.X
              r.Y=self.Y-n.Y
              r.Z=self.Z-n.Z
              return r
    def_mul_(self,n):
              r=Vecter3()
              r.X=self.X*n
              r.Y=self.Y*n
              r.Z=self.Z*n
              return r
    def_truediv_(self,n):
              r=Vecter3()
              r.X=self.X/n
              r.Y=self.Y/n
              r.Z=self.Z/n
              return r
    def_floordiv_(self,n):
              r=Vecter3()
              r.X=self.X//n
              r.Y=self.Y//n
              r.Z=self.Z//n
              return r
    def show(self):
              print(self.X,self.Y,self.Z))

  

以上是关于N维整型向量类的主要内容,如果未能解决你的问题,请参考以下文章

spark 类标签的稀疏 特征向量

set类vector类

使用 AVX2 对 2 个短整型向量进行向量加法

线性空间/线性基

线性空间/线性基

设计一个三维向量类,并实现向量的加法,减法以及向量与标量的乘法和除法运算