模板动态分配

Dynamic allocation with template

我创建了一个 class Vector 包含两个模板变量的变量,我正在尝试构建这样一个字典来告诉特定学生的分数。 问题是我正在努力使用模板动态分配内存。我必须这样做 没有地图或 STL 帮助。 你能解释一下如何正确分配它们吗?

#define DEF_CAPACITY 20
template <class U, class T>
class Vector {
protected:
    T* _data;
    U* _keys;
    int _size; //size in use
    int _capacity; //available capacity
public:
    //constructors
    Vector(int capacity = DEF_CAPACITY);
    ~Vector();
    int getSize() const { return size; }
    void insert(U key, T data);
    T operator[](U key);
};

template<class U, class T>
inline Vector<U, T>::Vector(int capacity)
{
    this->_capacity = capacity;
    this->_size = 0;
}

template<class U, class T>
Vector<U, T>::~Vector()
{
    if (_data)
        delete[] _data;
    if (_keys)
        delete[] _keys;
}

template<class U, class T>
void Vector<U, T>::insert(U key, T data)
{
    _keys[_size] = new U;
    //Maybe I have to do something like that, but all options I test doesn't work
    //keys[_size] = new U[Some size];
    _keys[_size] = key;

    _data[_size] = new T;
    _data[_size] = data;

    _size++;
}

template<class U, class T>
T Vector<U, T>::operator[](U key)
{
int index = 0;
for (int i = 0; i < size; i++)
    if (_keys[i] == key)
        index = i;
return _data[index];
}



int main() {
    Vector<string, int> grades;
    grades.insert("john", 90);
    grades.insert("marc", 100);
    grades.insert("ron", 87);
    grades.insert("lynda", 95);
    //...
    grades.insert("Tome", 93);
    //...
    cout << grades["marc"] << endl;
    cout << grades["lynda"] << endl;
    cout << grades["john"] << endl;
    return 0;
}

要分配 n 类型 T 的元素,您使用:

T* array = new T[n];

所以要为您的键和值分配 space:

// be aware: this will call the constructor for each element!!!
_keys = new U[n];
_data = new T[n];

如果你的“Vector”有固定的容量,这应该在你的构造函数中完成:

template<class U, class T>
inline Vector<U, T>::Vector(int capacity)
    : _data(new T[capacity]);
    , _keys(new U[capacity]);
    , _size(0);
    , _capacity(capacity);
{
}

之后,您可以像这样插入 key/value 对:

template<class U, class T>
void Vector<U, T>::insert(const U& key, const T& data)
{
    if(_size == _capacity)
        throw std::out_of_range("no space left!!!");
    _keys[_size] = key; // copy assignment
    _data[_size] = data; // copy assignment

    _size++;
}

此设计将不必要地为未使用的键和值调用构造函数。

您也可以使用 mallocfree 来防止这种情况,但我不建议这样做,而是使用标准库。