Skip to content

Latest commit

 

History

History
145 lines (111 loc) · 3.09 KB

深拷贝:.md

File metadata and controls

145 lines (111 loc) · 3.09 KB

深拷贝:

/*************************************************************************
        > File Name: shenkaobei.cpp
        > Author:
        > Mail:
        > Created Time: Fri Oct 27 13:52:27 2023
 ************************************************************************/

#include<iostream>

using namespace std;

#define BEGINS(x) namespace x{
#define ENDS(x)}

class A {
        public:
        int x, y;
};

ostream &operator<<(ostream &out, const A &a){
                out <<"("<< a.x << "," << a.y << ")";
                return out;
}
BEGINS(haizei)



template<typename T>

class Vector {
        public:
//              Vector(int n = 100) : n(n), data (new T[n]) {}
                Vector(int n = 100) : n(n), data((T*)calloc(sizeof(T), n)) {}

                Vector(const Vector &a) : n(a.n) {
                        data = (T*)malloc(sizeof(T) * n);
//                      data = new T[n];
//                      memcpy(data, a.data, sizeof(T) *n);   不可以这么用当传递 data中存储的对象也需要深拷贝时就错误了
                        for(int i = 0; i < n; i++){
                                new(data + i) T(a.data[i]);
                        }
                        return ;
                }

                T &at(int ind){
                        return data[ind];

                }
                T &operator[](int ind){
                        return data[ind];
                }
                void output(int m = -1){
                        if (m == -1) m = n;
                        if (data == nullptr) return;
                        for(int i = 0; i < m; i++){
                                cout << data[i] << " ";
                        }
                        cout << endl;
                        return ;
                }

        private:
                T *data;
                int  n;
};

ENDS(haizei)

BEGINS(test1)
using namespace haizei;

int main(){


        Vector<int> arr1;
        for(int i = 0; i < 10; i++){
                arr1.at(i) = i;
        }
        arr1.output(10);
        Vector<int> arr2(arr1);
        arr2.output(10);
        arr2[3] = 1000;
        arr1.output(10);
        arr2.output(10);
        return 0;
}

ENDS(test1)


BEGINS(test2)

using namespace haizei;

int main(){
        Vector<A> arr1;
        for(int i = 0; i < 10; i++){
                arr1[i] = (A){i, 2 * i};
        }
        arr1.output(10);
        Vector<A> arr2(arr1);
        arr2[3] = (A){4, 1000};
        arr1.output(10);
        arr2.output(10);

        return 0;
}

ENDS(test2)

BEGINS(test3)
using namespace haizei;

int main() {
//      Vector<Vector<int>> arr1;
//      Vector<Vector<int>> arr2(arr1);
    Vector<Vector<Vector<int>>> arr1;
        Vector<Vector<Vector<int>>> arr2(arr1);

        arr2[2][2][2] = 1000;

//      for(int i = 0; i < 3; i++){
//              arr1[i].output(3);
//      }
//      for(int i = 0; i < 3; i++){
//              arr2[i].output(3);
//      }

        return 0;
}

ENDS(test3)

int main(){
        using namespace haizei;
        test1 :: main();
        test2::main();
        test3::main();
        return 0;
}