C ++如何删除动态分配的2d数组中的特定行或列?

时间:2018-05-21 17:06:54

标签: c++ multidimensional-array dynamic-memory-allocation delete-operator

所以,我以这种方式动态分配了一个二维数组:

int rs, co;
cin >> ro;
cin >> co;

int **array = new int* [ro];

for(int i = 0; i < ro; i++){
    array[i] = new int [co];
}

我填写了它:

for(int i = 0; i < ro; i++){
    for(int j = 0; j < co; j++){
        cout << "Row: " << i << " Column: " << j << "  : ";
        cin >> *(*(array + i) + j);
    }
}

我的问题是: 如何释放用户给出X的X行或列? 我知道我应该使用“删除”命令,但我无法理解如何

2 个答案:

答案 0 :(得分:2)

您只需拨打

即可删除一行
delete [] array[i];

您无法删除列,因为列不像行一样排列。 例如,假设我们有一个像这样的2D数组:

row1: abcd
row2: efgh
row3: ijkl

在计算机中,数据实际排列如下:

abcd   .... other data.... efgh .... other data..... ijkl 

删除行很容易,因为计算机将它们排列在一起。但是,因为行是动态创建的,所以它们不必彼此相邻。它们分配在有空间的地方。

因此,列根本没有排列,“解除分配”没有意义。

答案 1 :(得分:0)

使用2D矢量阵列很容易。 只需对行使用擦除功能。 对于列,迭代行并删除每个元素:

int ro = 4, co = 3;
vector< vector<int> > vec(ro);
for (int i = 0; i < ro; i++)
    vec[i].resize(co);

// fill and print the matrix
for (int i = 0; i < vec.size(); i++) {
    for (int j = 0; j < vec[i].size(); j++) {
        vec[i][j] = i;
        cout <<vec[i][j] << " ";
    }
    cout << endl;
}

int rowErasePosition = 1;

vec.erase(vec.begin() + rowErasePosition);

// reprinting
cout << "second row deleted" << endl;
for (int i = 0; i < vec.size(); i++) {
    for (int j = 0; j < vec[i].size(); j++) {
        cout << vec[i][j] << " ";
    }
    cout << endl;
}

//deleting column
int columnErasePosition = 1;
for (int i = 0; i < vec.size(); i++) {
    vec[i].erase(vec[i].begin() + columnErasePosition);
}

// reprinting
cout << "second column deleted" << endl;
for (int i = 0; i < vec.size(); i++) {
    for (int j = 0; j < vec[i].size(); j++) {
        cout << vec[i][j] << " ";
    }
    cout << endl;
}