动态模板数组

Dynamic template arrays

本文关键字:数组 动态      更新时间:2023-10-16

我想要一个模板类包含两个模板动态数组作为成员变量。我还使用一个成员函数来给它们赋值。然而,我得到的问题与代码,我不知道的原因(可能是语法)。下面代码中的问题是什么?

template<typename T>
class ArrayHolder
 {
public:
ArrayHolder();
void setArrays( T [], T [],int,int);

private:
T *array1;
T *array2;
};

template<typename T>
ArrayHolderHolder<T>::setArrays(T firstarray[],T secondarray[] ,int N1, int N2)
{
array1 = new T[N1];
array2 = new T[N2];

}

setArrays中动态数组初始化后,从参数(firstarray,secondarray)中复制数组到它们的最有效方式是什么?

ArrayHolderHolder<T>::setArrays(T firstarray[],T secondarray[] ,int N1, int N2)
^^^^^^^^^^^^^^^^^

这里有一个错别字。类名是ArrayHolder,不是ArrayHolderHolder。而且,你没有写返回类型

由于不能(按值)传递数组,最好在形参列表中使用指针表示法函数,并且由于它是类模板,最好在类本身中定义函数:

template<typename T>
class ArrayHolder
{
  public:
     ArrayHolder();
     void setArrays(T *firstarray,T *secondarray ,int N1, int N2)
     {
        array1 = new T[N1];
        array2 = new T[N2];
        //if you want to copy, then use `std::copy` as:
        std::copy(firstarray, firstarray + N1, array1);
        std::copy(secondarray, secondarray + N2, array2);
     }
private:
   T *array1;
   T *array2;
};

顺便说一下,您可以使用st::vector来代替原始数组:

std::vector<T> array1;
std::vector<T> array2;

setArrays的参数表也是如此。如果你这样做,那么setArray将变成这样:

void setArrays(const std::vector<T> & first, const std::vector<T> & second)
{
    //maybe you need to do this!
    array1.clear();
    array2.clear();
    array1.insert(array1.end(), first.begin(), first.end());
    array2.insert(array2.end(), second.begin(), second.end());
}
很简单,不是吗?没有内存分配,没有内存回收!

或者更好的是,如果你按值接受参数,那么你可以这样写:

void setArrays(std::vector<T> first, std::vector<T> second)
{
    //no need to clear!
    array1.swap(first);
    array2.swap(second);
}

最后一个实现是库实现者首选的惯用解决方案。

除了@Nawaz回答:在setArrays()定义之前忘记了void返回类型

std::copy是最有效的方法。http://www.cplusplus.com/reference/algorithm/copy/

std::copy(firstarray, firstarray + N1, array1);
std::copy(secondarray, secondarray + N2, array2);

当然,这只是在您坚持使用数组的情况下。我个人总是使用标准模板库中的容器。在这种情况下,我将使用std::vector,但要各自使用。