动态模板数组

时间:2011-12-03 08:27:58

标签: c++ arrays templates dynamic

我希望模板类包含两个模板动态数组作为成员变量。我还使用成员函数为它们赋值。但是我遇到了代码问题,我不知道原因(可能是语法)。以下代码有什么问题?

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)复制到它们最有效的是什么?

3 个答案:

答案 0 :(得分:3)

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);
}

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

当然,这只是在你坚持使用数组时。我个人总是使用标准模板库中的容器。在这种情况下,我会使用std :: vector但每个都使用它们。