Как подобрать универсальные параметры для вызова функции
Нужно написать шаблон функции для сортировки двумерных массивов. У меня сортировка каждой строки отдельно от меньшего к большему пузырьком. Шаблон вызывается, если перегрузить его параметрами void Sort(T (*mas)[6], int n, int m) и void Sort(double(*mas)[3], int n, int m). Есть ли универсальные параметры, чтобы не нужно было делать перегрузку?
using namespace std;
template <typename T>
void Sort(T(*mas)[6], int n, int m)
{
int k = 0;
do {
for (int i = 0; i < m; i++)
{
for (int j = m-1; j > i; j--)
{
if (mas[k][j] < mas[k][j - 1])
{
T tmp = mas[k][j];
mas[k][j] = mas[k][j - 1];
mas[k][j - 1] = tmp;
}
}
}
k++;
} while (k < n);
}
void Sort(double(*mas)[3], int n, int m)
{
int k = 0;
do {
for (int i = 0; i < m; i++)
{
for (int j = m - 1; j > i; j--)
{
if (mas[k][j] < mas[k][j - 1]) swap(mas[k][j], mas[k][j - 1]);
/* {
T tmp = mas[k][j];
mas[k][j] = mas[k][j - 1];
mas[k][j - 1] = tmp;
}*/
}
}
k++;
} while (k < n);
}
int main()
{
setlocale(LC_ALL, "rus");
int const n = 4, m = 6;
int i_mas[n][m];
//cout << "Целочисленный массив\n";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
i_mas[i][j] = rand() % 10;
cout << i_mas[i][j] << " ";
}
cout << "\n";
}
cout << endl;
int const n2 = 4, m2 = 3;
double d_mas[n2][m2];
//cout << "Вещественный массив:\n";
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < m2; j++)
{
d_mas[i][j] = (rand() % 10 + rand() % 10*0.1);
cout << d_mas[i][j] << " ";
}
cout << "\n";
}
cout << endl;
char c_mas[n][m];
//cout << "Символьный массив:\n";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
c_mas[i][j] = rand() % 26 + 97;
cout << c_mas[i][j] << " ";
}
cout << "\n";
}
cout << endl;
Sort(i_mas, n, m);
//cout << "\nЦелочисленный массив после сортировки:\n";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++) cout << i_mas[i][j] << " ";
cout << endl;
}
cout << endl;
Sort(d_mas, n2, m2);
//cout << "\nВещественный массив после сортировки:\n";
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < m2; j++)
{
cout << d_mas[i][j] << " ";
}
cout << "\n";
}
cout << endl;
Sort(c_mas, n, m);
//cout << "Символьный массив после сортировки:\n";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << c_mas[i][j] << " ";
}
cout << "\n";
}
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Вы можете добавить параметр размера массива
template <typename T, size_t N>
void Sort(T (*mas)[N], int n, int m)
Но это очень половинчатое решение. Потому что имеет смысл добавить и второй размер, и тогда вам не придется передавать в функцию размеры отдельно:
template <typename T, size_t N, size_t M>
void Sort(T (&mas)[N][M])
{
int k = 0;
do {
for (int i = 0; i < M; i++)
{
for (int j = M-1; j > i; j--)
{
if (mas[k][j] < mas[k][j - 1])
{
T tmp = mas[k][j];
mas[k][j] = mas[k][j - 1];
mas[k][j - 1] = tmp;
}
}
}
k++;
} while (k < N);
}
После этого при вызове функции ей достаточно передать только массив:
Sort(d_mas);