c++ - 置换二维数组中的元素

标签 c++ arrays multidimensional-array permutation

我试图通过在我的程序中使用二维数组来移动矩阵的零点以获得它的未成年人。如何正确删除(移动)二维数组的元素?

我知道如何通过排列其元素来处理一维数组的这个问题

for (int i = DEL; i < (SIZE - 1); i++)
    array[i] = array[i + 1];

其中 DEL - 我们要删除的元素的索引,SIZE - 数组的大小。但是我用多维数组得到的结果不一样:

for (int i = DEL; i < (SIZE - 1); i++)
    for (int j = DEL; j < (SIZE - 1); j++)
        array[i][j] = array[i+1][j+1];

哪里错了?

#include <iostream>

using namespace std;

int main()
{
    int array[3][3] = {
        1, 2, 3,
        4, 5, 6, 
        7, 8, 9};

    // Setting to zero 2nd row and 3rd column
    int m = 1; // 2
    int n = 2; // 3


    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            array[m][j] = 0;
            array[i][n] = 0;
            cout << array[i][j];
            // Trying to shift every element, which equals zero
            if (array[i][j] == 0)
                for (int k = i; k < 2; k++)
                    for (int l = j; l < 2; l++)
                        array[k][l] = array[k+1][l+1];          

        }
        cout << endl;
    }



    cout << endl;

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            cout << array[i][j];
        cout << endl;
    }
}

我得到:

120
000
780

120
000
780

但实际上我希望最后的输出是这样的:

120
780
000

最佳答案

我认为“置换”一词不适合这里。您想要从二维数组中删除行和列。

但是你犯了一些语义错误。我为您解决了这个问题,并在下面向您展示了更正后的代码。

一个重要的建议。尝试将一个大问题缩小为几个较小的问题。您在多嵌套 for 循环中尝试过多。一个接一个地做。

请看:

#include <iostream>

constexpr size_t MaxArraySize = 3;

int main()
{
    int array[MaxArraySize][MaxArraySize] = {
        1, 2, 3,
        4, 5, 6,
        7, 8, 9 };

    // Setting to zero 2nd row and 3rd column
    int rowToDelete = 1; // 2
    int colToDelete = 2; // 3

    // Set cell to delete to 0
    for (int row = 0; row < MaxArraySize; ++row)
    {
        for (int col = 0; col < MaxArraySize; ++col)
        {
            array[rowToDelete][col] = 0;
            array[row][colToDelete] = 0;
            std::cout << array[row][col];
        }
        std::cout << '\n';
    }

    // First shift all rows
    for (int row = rowToDelete; row < MaxArraySize - 1; ++row)
        for (int col = 0; col < MaxArraySize; ++col)
            array[row][col] = array[row+1][col];

    // Then shift all cols
    for (int col = colToDelete; col < MaxArraySize-1; ++col)
        for (int row = 0; row < MaxArraySize; ++row)
            array[row][col] = array[row][col+1];

    // Set the cells that were shifted away to 0
    for (int row = 0; row < MaxArraySize; ++row)
        array[row][MaxArraySize - 1] = 0;
    for (int col = 0; col < MaxArraySize; ++col)
        array[MaxArraySize - 1][col] = 0;

    // Show result
    std::cout << "\n\nResult\n\n";
    for (int row = 0; row < MaxArraySize; ++row)
    {
        for (int col = 0; col < MaxArraySize; ++col)
            std::cout << array[row][col];
        std::cout << '\n';
    }
}

第二个甚至更重要。您正在使用带有普通 C 样式数组的普通 C 代码。您的代码中唯一的 C++ 是使用 iostreams。那可不太好。

尝试使用 C++。永远不要使用普通的 C 样式数组。尝试使用 STL 中的算法和容器。为变量使用更好的名称。

生成的代码片段将非常简单。在这里,我们实际上是在删除行和列。请参阅:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
    // Lambda for printing the matric to std::cout
    auto print = [](std::vector<std::vector<int>> & m) {
        std::for_each(m.begin(), m.end(), [](std::vector<int> & vi) { std::copy(vi.begin(), vi.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; });
    };
    // You can add whatever values. 
    std::vector<std::vector<int>> matrix {
        {11, 12, 13, 14},
        {15, 16, 17, 18},
        {19, 20, 21, 22},
        {23, 24, 25, 26}
    };
    // Show initial data
    std::cout << "\n\nInitial matrix:\n";
    print(matrix);

    constexpr size_t RowToDelete = 1; // Row 2
    constexpr size_t ColToDelete = 2; // Column3

    // Erase row
    matrix.erase(matrix.begin() + RowToDelete);
    // Erase column in each row
    std::for_each(matrix.begin(),matrix.end(), [ColToDelete](std::vector<int> & vi) { vi.erase(vi.begin() + ColToDelete); });

    // Show result
    std::cout << "\n\nResulting matrix with deleted row " << RowToDelete+1 << " and deleted column " << ColToDelete+1 << '\n';
    print(matrix);

    return 0;
}

希望这对您有所帮助。 . .

关于c++ - 置换二维数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57012671/

相关文章:

php - 将 WordPress 帖子元转换为 PHP 数组

c - 如何在 c 中声明具有非常量值的二维数组?

ruby-on-rails - 如何在 Rails 中创建对象数组?

c++ - 如何返回二维字符数组 C++?

c++ - 无法制作固定大小数组的 vector ?

c++ - 指针安全对象?

c++ - printf 与 long long int 的结果不一致?

c++ - 找到稀疏矩阵( Eigen )最大值的有效方法

python - reshape numpy为滞后值添加额外维度

arrays - 函数中 int* a 和 int (*a)[N] 的区别?