Динамические массивы шаблонов - PullRequest
0 голосов
/ 03 декабря 2011

Я хочу, чтобы класс шаблона содержал два динамических массива шаблона в качестве переменных-членов. Я также использую функцию-член для присвоения им значений. Однако у меня возникли проблемы с кодом, и я не знаю причину (вероятно, синтаксис). В чем проблема в следующем коде?

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 ]

3 голосов
/ 03 декабря 2011
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 голос
/ 03 декабря 2011

В дополнение к ответу @Nawaz: вы забыли void тип возврата до определения setArrays ().

0 голосов
/ 03 декабря 2011

std :: copy является наиболее эффективным способом.http://www.cplusplus.com/reference/algorithm/copy/

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

Конечно, это только если вы настаиваете на использовании массивов.Лично я всегда использую контейнер из стандартной библиотеки шаблонов.В этом случае я бы использовал std :: vector, но каждому свой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...