首页 > 解决方案 > 在简单的向量类中复制数据

问题描述

我正在尝试编写自己的矢量类:

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 ,所以如果我想在我的末尾删除 temppush_back功能 my data_members 将丢失。那么这样做的正确方法是什么?

其次,如果我想创建一个strings 的动态数组,我的程序有时会崩溃,我想,这是因为memcpy()在我的resize函数中,我仍然不知道我应该做什么来代替它?

标签: c++templatesvectordynamic

解决方案


推荐阅读