c++ - 动态模板数组

标签 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)中复制数组到他们那里最有效?

最佳答案

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

这是一个错字。类名是ArrayHolder,而不是ArrayHolder。此外,您没有编写返回类型

因为你不能传递数组(按值),最好在参数列表中使用指针符号函数,并且因为它是类模板,更喜欢在类本身中定义函数:

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

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

关于c++ - 动态模板数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8366505/

相关文章:

c++ - 如何从头文件将运算符定义添加到现有结构?

c++ - 限制模板函数,只允许某些类型

c++ - 如何使用模板专门化模板?

arrays - 数组的变异扩展

javascript - 找到对象数组angularjs的索引

c - 从数组中删除第 n 个元素 (char *)

c++ - 带有 static_assert 的漂亮 sfinae

c++ - 模拟从标准模板库中删除的函数无法正常工作

c++ - type cast 和 之间的关联性。在 Visual Studio

c++ - 编译器是否为未使用的类生成 vtable