Удаление строки статического массива
Я работаю со статической матрицей, сначала задаю число строк и столбцов (допустим 1000х1000), а затем использую какую-то подматрицу. Задача состоит в том, чтобы удалить первую строку массива. Я думал над тем, чтобы переопределить указатель с первой строки на вторую, но не совсем понимаю, как это можно сделать. Есть еще вариант сдвинуть каждую строку вверх на одну, но этот способ мне кажется неэффективным, есть ли какие-то разумные решения?
Ответы (1 шт):
"Сдвинуть указатель" можно, хотя это будет несколько через... вобщем, не самым прямым путем.
В С++ проще всего воспользоваться ссылкой:
int m[5][5] =
{
{ 1,2,3,4,5},
{ 6,7,8,9,10},
{ 11,12,13,14,15},
{ 16,17,18,19,20},
{ 21,22,23,24,25}
};
typedef int reduced_matrix[4][5];
reduced_matrix& r = *(reduced_matrix*)(m+1);
for(int i = 0; i < 4; ++i)
{
for(int j = 0; j < 5; ++j)
{
cout << r[i][j] << " ";
}
cout << endl;
}
(Полный текст программы - тут.) Но почему бы вам не воспользоваться тем же динамическим массивом, или, еще лучше - векторами? Так вы получите куда более гибкое решение.
В случае C так просто подменить матрицу мне не удалось, пришлось использовать лишний уровень косвенности -
typedef int reduced_matrix[4][5];
reduced_matrix * r = (reduced_matrix*)(m+1);
for(int i = 0; i < 4; ++i)
{
for(int j = 0; j < 5; ++j)
{
printf("%2d ",(*r)[i][j]);
}
puts("");
}
Однако нет никаких проблем передать такую смещенную матрицу в функцию:
void out_matrix(int r[4][5])
{
for(int i = 0; i < 4; ++i)
{
for(int j = 0; j < 5; ++j)
{
printf("%2d ",r[i][j]);
}
puts("");
}
}
...
out_matrix(m+1);
(Полный код тут.)