Функция, удаляющая повторяющиеся элементы массива
Написал код, который удаляет повторяющиеся элементы массива (но удаляет их копии, то есть если в массиве встретить два элемента: 2 2, то одну двойку он должен удалить, а вторую оставить).
Как можно теперь записать данный алгоритм в виде отдельной функции по удалению повторяющихся элементов массива?
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand((int)time(0));
int n;
cout <<"n="; cin >>n;
double*a = new double[n];
for (int i = 0; i < n; i++)
{
a[i]=rand()%5 + 1;
cout <<a[i]<<" ";
}
cout <<endl;
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (a[i]==a[j])
{
for (int k = j; k < n; k++)
a[k]=a[k + 1];
n--;
j--;
}
for (int i = 0; i < n; i++)
cout <<a[i]<<" ";
cout <<endl;
delete[]a;
system("pause");
return 0;
}
Ответы (2 шт):
Автор решения: Andrianov Roma
→ Ссылка
Посоветовал бы воспользоваться std::vector и реализованными методами для решения этой задачи.
Но с вашим кодом функции будут выглядеть следующим образом:
template<typename T>
void resize(T* t,const int n)
{
T* resize_arr = new T[n];
for (int i = 0; i < n; i++)
resize_arr[i] = t[i];
t = resize_arr;
delete[] resize_arr;
}
template<typename T>
int reduce_duplicates(T& t, const int n)
{
int res = n;
for (int i = 0; i < res - 1; i++)
{
for (int j = i + 1; j < res; j++)
{
if (t[i]==t[j])
{
for (int k = j; k < res; k++)
{
t[k]=t[k + 1];
res--;
j--;
resize(&t, res);
}
}
}
}
return res;
}
Автор решения: Harry
→ Ссылка
Поскольку о необходимости устойчивости ничего не сказано и раз у вас
double*a = new double[n];
(хотя сравнивать на равенство числа с плавающей точкой несколько, гм... опрометчиво)
то можно
sort(a,a+n);
n = unique(a,a+n) - a;
Все, у вас массив уникальных элементов из nштук...