如何删除2d数组中的元素

时间:2018-03-23 11:42:11

标签: c++ arrays

美好的一天,我试图在线搜索寻找如何删除二维数组中的元素的样本,但没有用。如果我的问题看起来不清楚和业余,请原谅我。

删除二维数组中特定元素的简单代码是什么? 我正在使用静态数组,并且尚未了解动态和向量。

#include<iostream>
#include<string>

std::string array[3][6] = {{"a","b","c","d","e","f",},
                            {"g","h","i","j","k","l",},
                            {" "," "," "," "," "," ",}}; //i made some allowance so that i can insert/delete

void display();

using namespace std;

int main(){

    char xdelete;
    char ydelete;

    display();

    cout<<"\nDelete character" <<endl;
    cout<<"enter position x: "; 
    cin>>xdelete; 
    cout<<"enter position y: ";
    cin>>ydelete;

    for(int x = xdelete; x<2; x++){
        for(int y = ydelete ;y<6;y++){
            array[x][y] = array[x][y+1]; // yup, this is wrong >.<
        }
    }

    display();

}

//display
void display(){

    cout<<endl;
    for(int z = 0; z<6; z++){
        cout<<"  "<<z;
    }
    cout<<endl;

    for(int x = 0; x<2; x++){
    cout<<x <<"|";
        for(int y = 0; y<6; y++){
            cout<<" " <<array[x][y] <<" "; 
        }
    cout<<endl;
    }
}

这是给定的:输入位置x:0                    输入位置y:1

 0  1  2  3  4  5
0| a  b  c  d  e  f
1| g  h  i  j  k  l

这是我想要的输出

 0  1  2  3  4  5
0| a  c  d  e  f  g
1| h  i  j  k  l  

5 个答案:

答案 0 :(得分:0)

您不需要外部for循环,只需使用xdelete即可访问该行。

y循环中,您必须停在y < 5,否则您将在该行外访问。在循环之后,您应该用空格替换以下元素,否则您将拥有该行中最后一项的副本。

int y;
for (y = ydelete; y < 5; y++) {
    array[xdelete][y] = array[xdelete][y+1];
}
array[xdelete][y] = " ";

答案 1 :(得分:0)

无法从数组中删除元素。数组T[N]在其整个生命周期中包含NT个元素。

另一个类似于删除的操作是将所有连续元素分配给它们的左边一个索引,这样“被删除”索引中的元素就会被覆盖。这将使最后一个索引处的元素成为倒数第二个索引的副本。

答案 2 :(得分:0)

您应该保留数组中元素的实际数量,当使用数组执行删除元素等操作时,将数组解释为一维数组会更简单。

这是一个示范程序

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>

std::ostream & display( const std::string *a, size_t n, size_t cols, std::ostream &os = std::cout )
{
    for ( size_t i = 0; i < n; i++ )
    {
        os << a[i] << ( ( i + 1 ) %  cols == 0 ? '\n' : ' ' ); 
    }

    return os;
}

int main() 
{
    const size_t M = 3, N = 6;
    std::string array[M][N] = 
    {
        { "a", "b", "c", "d", "e", "f", },
        { "g", "h", "i", "j", "k", "l", },
    };

    auto it = std::find( *array, *array + M * N, std::string() );

    size_t n = std::distance( *array, it );

    display( *array, n, N ) << std::endl;

    size_t row, col;

    std::cout<<"Delete character\n";
    std::cout << "enter row: "; 
    std::cin >> row; 
    std::cout << "enter column: ";
    std::cin >> col;

    if ( N * row + col < n )
    {
        size_t pos = N * row + col;

        std::move( *array + pos + 1, *array + n, *array + pos );
        --n;
    }

    std::cout << '\n';
    display( *array, n, N ) << std::endl;

    return 0;
}

它的输出可能看起来像

a b c d e f
g h i j k l

Delete character
enter row: 0
enter column: 1

a c d e f g
h i j k l 

答案 3 :(得分:0)

这里有一点重复,还有额外的建议

正如其他人所说,你不能从数组中删除元素,你可以移动它们。 关于您的代码:它确实转移(只需更改名称array,然后将xdeleteydelete的类型更改为int s。但是,[y + 1]你最终走出界限,这会导致问题。

为了更接近于在静态2d数组中删除,在移动初始数组之后,创建一个size =(originalsize - 1)的新数组,并将所有内容从第一个复制到秒数(除了最后一个元素);

答案 4 :(得分:0)

(比如说)我有一个整数数组 - A[3][4] 如果您不确定如何将下一行的第一项移动到当前行的最后一项的位置,那么这可能是一个可能的解决方案:

//Deleting an item from the array
int Row,Column;
cout<<endl<<"Enter the index from where you wish to delete the item: ";
cin>>Row>>Column;
int Deleted;
Deleted=A[Row][Column];
for(int i=Row; i<3;i++){
    int n=0;
    for(int j=Column; j<4; j++){
        n++;
        if(n==3)
            A[i][j]= A[i+1][(j+1)%4];
        else
            A[i][j]= A[i][(j+1)%4];
    }
}
cout<<endl<<"Item deleted"<< "="<<Deleted<<endl;
//Displaying Array after deleting the item
for(int i=0; i<3; i++) {
    for (int j = 0; j < 4; j++) {
     cout<<" "<< A[i][j];
    }
}