如何用动态数组删除2d数组c++中的列



我想删除2d数组中最大整数的列,我是这样做的,但为什么要删除列和行?我可以修复它并只删除列吗?任务是用delete命令完成,但现在我认为这是不可能的

#include <iostream>
using namespace std;
int main()
{
int row = 3, col = 3;
int** arr = new int* [row];
for(int i = 0; i < row; i++){
arr[i] = new int[col];
}
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++) {
cin >> arr[i][j];
}
}
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
cout << " ------------- " << endl;
int max = 0, index = 0;
for(int i =0; i < row; i++){
for(int j = 0; j < col; j++){
if(arr[i][j] > max){
max = arr[i][j];
index = i;
}
}
}
delete [] arr[index];
int** tmp = new int*[index - 1];
int tmpI = 0;
for(int i = 0; i < col; i++){
if(i != index){
tmp[tmpI++] = arr[i];
}
}
delete [] arr;
arr = tmp;
col = col - 1;
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}

对于初学者,变量索引设置为行号

index = i;

然后删除该行

delete [] arr[index];

但是您要删除的是一列而不是一行。所以这个代码没有意义。

此外,您错误地搜索了最大元素。如果用户将输入所有负值,则最大值将等于0,尽管数组中不存在具有该值的元素。

在本声明中,

int** tmp = new int*[index - 1];

您分配的数组的行数比原始数组中的行数少一行。此外,如果index等于0,则分配了非常大的内存范围。

此声明

delete [] arr;

产生内存泄漏。

你需要的似乎是下面的

#include <iostream>
int main() 
{
size_t row = 3, col = 3;

int **arr = new int * [row];
for ( size_t i = 0; i < row; i++ )
{
arr[i] = new int[col];
}

for ( size_t i = 0; i < row; i++ )
{
for ( size_t j = 0; j < col; j++ ) 
{
std::cin >> arr[i][j];
}
}

for ( size_t i = 0; i < row; i++ )
{
for ( size_t j = 0; j < col; j++ ) 
{
std::cout << arr[i][j] << " ";
}
std::cout << std::endl;
}

std::cout << "------------- " << std::endl;

size_t max_i = 0, max_j = 0;

for ( size_t i = 0; i < row; i++ )
{
for ( size_t j = 0; j < col; j++ )
{
if ( arr[max_i][max_j] < arr[i][j] )
{
max_i = i; max_j = j;
}
}
}

int **tmp = new int*[row];
for ( size_t i = 0; i < row; i++ )
{
tmp[i] = new int[col-1];
}

for ( size_t i = 0; i < row; i++ )
{
for ( size_t j = 0, k = 0; j < col; j++ )
{
if ( j != max_j ) tmp[i][k++] = arr[i][j];
}
}

for ( size_t i = 0; i < row; i++ )
{
delete [] arr[i];
}

delete [] arr;

arr = tmp;

--col;

for ( size_t i = 0; i < row; i++ )
{
for ( size_t j = 0; j < col; j++ ) 
{
std::cout << arr[i][j] << " ";
}
std::cout << std::endl;
}

for ( size_t i = 0; i < row; i++ )
{
delete [] arr[i];
}

delete [] arr;

return 0;
}

程序输出可能看起来像

1 2 3 
6 5 4 
7 9 8 
------------- 
1 3 
6 4 
7 8 

这里有另一个建议:将数据存储为row x column格式。如果更改为column x row格式,则删除列会变得更容易。我还制作了一个辅助函数来打印矩阵,并将输入循环和找到最大的循环组合在一起

#include <iostream>
#include <iomanip>
#include <cstdlib>  // for rand
#include <climits>
using namespace std;
void print_matrix(int** arr, int rows, int columns)
{
for(int row = 0; row < rows; row++){
for(int col = 0; col < columns; col++) {
cout << setw(2) << arr[col][row] << " ";
}
cout << "n";
}
}
int main()
{
srand(time(nullptr));  // For testing

int rows = 3, columns = 3;

// Create the matrix
int** arr = new int *[columns];
for (int col = 0; col < columns; col++) {
arr[col] = new int[rows];
}

// Input values - finding max, too
int max_value = INT_MIN, max_value_column = -1;
for (int row = 0; row < rows; row++) {
for (int col = 0; col < columns; col++) {
//cin >> arr[col][row];
arr[col][row] = rand() % 50;    // Using rand for testing.
if (arr[col][row] > max_value) {
max_value = arr[col][row];
max_value_column = col;
}
}
}   
print_matrix(arr, rows, columns);
cout << " ------------- " << endl;
// Delete the column with max
delete [] arr[max_value_column];
columns--;
// Shift columns to the right of the deleted column left one
for (int col = max_value_column; col < columns; col++) {
arr[col] = arr[col + 1];
}
print_matrix(arr, rows, columns);
return 0;
}

最新更新