Копирование данных в простой векторный класс - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь написать свой собственный векторный класс:

template <typename T>
class Vector {
public:
    Vector(int default_size = 2) :
        size(0), data_member(new T[default_size]), capacity(default_size) {};

    Vector(const Vector& obj)
    {
        data_member = new T[obj.size];
        data_member = obj.data_member;
        size = obj.size;
        capacity = obj.capacity;
    }

    void push_back(T& elem)
    {
        if (size == capacity)
            resize(2 * size);
        data_member[size] = elem;
        size++;

    }

    void push_front(T& data)
    {
        if (size + 1 == capacity)
            resize(2 * size);
        for (int i = size - 1; i >= 0; i--)
        {
            data_member[i + 1] = data_member[i];
        }
        data_member[0] = data;
        size++;
    }

    void pop_back()
    {
        --size;
    }

    void resize(int size_)
    {
        if (size_ > capacity)
        {
            T* temp = new T[size_];
            memcpy(temp, data_member, size * sizeof(T));
            delete[] data_member;
            data_member = new T[size_];
            data_member = temp;
            //delete[] temp;
            capacity = size_;
        }
    }

    int get_size() { return size; }

    T* getarr() { return data_member; }

private:
    T* data_member;
    int size;
    int capacity;

};

, и вот основной для тестирования моего класса

int main()
{
    Vector<int> myint;
    int a = 5, b = 8, c = 9;
    myint.push_back(a);
    myint.push_back(b);
    myint.push_back(c);
    Vector<int> you = myint;
    int* arr1 = you.getarr();
    for (int i = 0; i < you.get_size(); i++)
    {
        cout << *arr1 << endl;
        arr1++;
    }
    cout << endl << endl;
    int h[3] = { 1,2,3 };
    int* hp = h;
    int g[3] = { 4,5,6 };
    int* gp = g;
    int f[3] = { 4,5,6 };
    int* fp = f;
    Vector<int*> myarrint;
    myarrint.push_back(hp);
    myarrint.push_back(gp);
    myarrint.push_back(fp);
    int** arr = myarrint.getarr();
    for (int i = 0; i < myarrint.get_size(); i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cout << **arr << endl;
            (*arr)++;
        }
        arr++;
    }
    cout << endl << endl;
    Vector<string> mystr;
    string s1 = "I";
    string s2 = "went";
    string s3 = "shopping";
    mystr.push_back(s1);
    mystr.push_back(s2);
    mystr.push_back(s3);
    string* str1 = mystr.getarr();
    for (int i = 0; i < mystr.get_size(); i++)
    {
        cout << *str1 << endl;
        str1++;
    }
    cout << endl << endl;
    string i = "wow";
    mystr.push_front(i);
    string* str2 = mystr.getarr();
    for (int i = 0; i < mystr.get_size(); i++)
    {
        cout << *str2 << endl;
        str2++;
    }
    cout << endl << endl;
    return 0;
}

Я новичок в C ++, и я действительно запутанный, я думаю, что в моей push_back функции я просто указываю своим объектам на temp и не копирую в них temp, поэтому, если я хочу удалить temp в конце моей push_back функции мои data_member будут потеряны. Так какой же правильный способ сделать это?

секунда, если я хочу создать динамический c массив из string s, моя программа будет иногда обрабатывать sh, и я думаю, это из-за memcpy() в моей функции resize, я все еще не знаю, что мне делать вместо нее?

...