C ++与自己的动态模板向量类

时间:2017-04-07 18:58:15

标签: c++ templates vector

我正在开展一个项目,我必须为大学做些什么。我想做一个简单的容器程序,我的目标是,我可以添加尽可能多的名称,以及我想要的每个名称的多个属性。每个proberty都有一个标题(例如:" Name")和一个值(例如:" Jane")。

我已经使用包含的STL矢量类完成了它,但我应该在没有STL库的情况下完成它,所以我已经编写了自己的。当然,它现在还没有工作,一个程序冻结,然后就可以开始了。与错误相关,我发现" a_row"课程在课程期间被叫过两次,但我不明白为什么。

我想在这里批量复制很多行,但是我一直在搜索问题3天,没有人能找到问题,在我身边。以下是代码,我已经简化了它,为你:)

矢量类:

#include <iostream>
#include <string>

template <class T>
class vector{
    T* my_array;
    unsigned int vector_size;
public:
    vector():vector_size(0){}
    ~vector(){
        delete[] my_array;
    }
vector(const vector& rhs){
    vector_size = rhs.size();
    my_array = new T[vector_size];
    for(unsigned int i=0;i<vector_size;i++) my_array[i] = rhs[i];
}
T& operator[](unsigned int i) {return my_array[i];}
const T& operator[](unsigned int i) const {return my_array[i];}

vector& operator=(const vector& rhs){
    if (&rhs!=this){
        delete[] my_array;
        vector_size = rhs.size();
        my_array = new T[vector_size];
        for(unsigned int i=0;i<vector_size;i++) my_array[i] = rhs[i];
    }
    return *this;
}

void push_back(const T& rhs){
    T* tmp = new T[vector_size+1];
    for(unsigned int i=0;i<vector_size;i++)
        tmp[i] = my_array[i];
    tmp[vector_size] = rhs;
    delete[] my_array;
    my_array = tmp;
    vector_size++;
}

unsigned int size() const{return vector_size;}

void erase(unsigned int x){
    if (vector_size>0){
        T* tmp = new T[vector_size-1];
        unsigned int counter = 0;
        for (unsigned int i=0;i<vector_size;i++){
            if (i!=x) {
                tmp[counter++] = my_array[i];
            }
        }
        delete[] my_array;
        my_array = tmp;
        vector_size--;
    }
}
};

以下是联系人计划的类别:

class a_row{
    std::string header;
    std::string value;
public:
    a_row(const std::string& h="No name",const std::string& v="No "):header(h),value(v){}

    std::string geth() const{return header;}
    std::string getv() const{return value;}

};

class a_name_card{
    vector<a_row> properties;
public:
    a_name_card(const std::string& f1="No name",const std::string& e1="No name"){
        properties.push_back(a_row(f1,e1));
    }

    unsigned int size()const{return properties.size();}

    a_row& get_a_row(int i){return properties[i];}

    void add(const std::string& f1="No name",const std::string& e1="No name"){
        properties.push_back(a_row(f1,e1));
    }

};

class list_of_name_cards{
    vector<a_name_card> array_of_names;
public:
    a_name_card& operator[](int i){return array_of_names[i];}

    void add(const std::string& f1="No name", const std::string& e1="No name"){
        array_of_names.push_back(a_name_card(f1,e1));
    }

    unsigned int size() const{return array_of_names.size();}
};

以下是简单的主程序:

int main(){
    list_of_name_cards names;
    names.add("Name","Jane");
    return 0;
}

如果您已经阅读过,我会非常感谢您的帮助和感谢。

p.s。:对不起我的英语,但英语不是我的母语。

1 个答案:

答案 0 :(得分:3)

您需要初始化变量:

vector():vector_size(0){}

my_array怎么样?

vector():my_array(nullptr), vector_size(0){}