Мне было интересно .. Всякий раз, когда я имею дело с массивами, когда я должен их разрезать, или отсортировать, или что-то еще, а затем вернуть его, я передаю его функции void, такой как f(array, length, newarray), и в объявлении функции у меня есть void f(T *array, int length, T *&new array).
Есть лучший способ это сделать?
Вот код, я хочу удалить повторы из массива:
template<class T>
void eliminate(T *niz, int duzina, T *&podniz)
{
int ind;
podniz = new T[duzina];
for (int i = 0; i<duzina; i++)
{
ind = 0;
for (int j = i; j<duzina; j++)
{
if (niz[i] == niz[j])ind++;
}
if (ind == 1)podniz[nova++] = niz[i];
}
}
Определите «лучше».
Поделитесь кодом
Да, есть. Используйте std::array или std::vector.
Это слишком общий вопрос. Возвращать новый массив «функционально» лучше.
@Ron: Однако вырезать элементы из std::array немного сложно;)
@MSalters Я добавил код ..
@MSalters Действительно, я пропустил это при первом чтении.





Конечно. Вы можете использовать указатели и передавать массив по ссылке на функцию. Затем манипулируйте массивом и возвращайтесь из функции с типом void, т.е. нет необходимости возвращать массив, поскольку он передается по ссылке.
В C++ передача массива по ссылке означает нечто иное, чем передача указателя.
Как уже отмечалось в комментариях, вам действительно нужен std::vector.
Основная проблема с вашим кодом заключается в том, что невозможно определить, сколько элементов вывода фактически инициализировано. А доступ к неинициализированным элементам - это Undefined Behavior, поэтому вы возвращаете вызывающему объекту бомбу замедленного действия.
С std::vector<T> eliminate(std::vector const&) таких сомнений нет. Возвращенный вектор содержит ровно .size() элементов.
Vector также безопасен в отношении исключений. В вашем коде будет утечка памяти, если конструктор копирования T выдает, например на std::bad_alloc.
У меня есть глобальная переменная для подсчета количества элементов, поскольку, как вы видите, она не инициализирована в самой функции.
Спасибо, я буду придерживаться std :: vector, как только закончу курс, где мы научимся кодировать std :: vector.
А что насчет функции, возвращающей новый массив? Что-то вроде
T* f(T* array, int length);