【问题标题】:How to delete a column in 2d array in c++如何在c ++中删除二维数组中的列
【发布时间】:2019-09-11 13:13:01
【问题描述】:

我在 C++ 中有一个基本的二维数组。我想删除一个特定的列并将下一列放在它的位置。我的数组是 姓名[ ] 商标[ ] FNAME[ ] REG#[ ]
Name 和 FNAME 在第一个二维数组(字符串)中,而 Tmarks 和 reg # 在第二个二维数组(int)中

我已经在 StackOverflow 上尝试过解决方案,但无法正常工作。

#include <iostream>
using namespace std;
#define ROW 2
#define COL 70
void input(string data[][COL], int moredata[][COL], int n)
{
    for (int i = 0; i < ROW; i++)
    {
    for (int j = 0; j < n; j++)
    {
        if (i == 0)
        {
            cout << " Name of Student #  : " << j + 1 << endl;
            cin >> data[i][j];
            cout << "Total Marks out of 600 of student #  " << j + 1 <<
            endl;            
            cin >> moredata[i][j];
        }
        if (i == 1)
        {
            cout << " Father Name of Student # " << j + 1 << endl;
            cin >> data[i][j];
            cout << "Reg # of student # " << j + 1 << endl;
            cin >> moredata[i][j];
        }
     }
     }
}
int main()
{
int n;
string data[ROW][COL] = {};
int moredata[ROW][COL] = {};
cout << "NO of Students: ";
do
{
    cin >> n;
} while (n > 70 || n < 0);
input(data, moredata, n); //input function already created.

现在我想做一个删除单列的函数。

【问题讨论】:

  • 想想基本情况,你想从数组中删除一个元素。由于您的表是一个数组数组,因此您只需对每一行重复此基本任务。您还可以发布您已经尝试过的代码吗?如果您不发布那个代码以及您使用它时遇到的错误,那么很难知道您遇到的问题是什么。

标签: c++ algorithm multidimensional-array copy move


【解决方案1】:

您不能从数组中删除列。但是您可以将列的所有元素向左移动以填充“已删除”列并保留数组的实际列数。

这是一个演示程序。在程序中,变量n存储了一个二维数组的实际列数。

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

template <typename T>
bool remove_column( T &a, size_t n, size_t pos )
{
    const size_t N = 
        std::extent<typename std::remove_reference<decltype( a )>::type, 1>::value;

    bool success = n <= N && pos < n;

    if ( success )
    {
        for ( auto &row : a )
        {
            std::copy( std::next( std::begin( row ), pos + 1 ), 
                       std::next( std::begin( row ), n ),
                       std::next( std::begin( row ), pos ) );
        }
    }

    return success;
}

int main() 
{
    const size_t M = 4;
    const size_t N = 5;
    std::string a[M][N] =
    {
        { "A0", "B0", "C0", "D0", "E0" },
        { "A1", "B1", "C1", "D1", "E1" },
        { "A2", "B2", "C2", "D2", "E2" },
        { "A3", "B3", "C3", "D3", "E3" },
    };

    size_t n = N;

    for ( const auto &row : a )
    {
        for ( size_t i = 0; i < n; i++ )
        {
            std::cout << row[i] << ' ';
        }
        std::cout << '\n';
    }

    std::cout << '\n';

    if ( remove_column( a, n, 0 ) ) --n;

    for ( const auto &row : a )
    {
        for ( size_t i = 0; i < n; i++ )
        {
            std::cout << row[i] << ' ';
        }
        std::cout << '\n';
    }

    std::cout << '\n';

    if ( remove_column( a, n, n - 1 ) ) --n;

    for ( const auto &row : a )
    {
        for ( size_t i = 0; i < n; i++ )
        {
            std::cout << row[i] << ' ';
        }
        std::cout << '\n';
    }

    std::cout << '\n';

    if ( remove_column( a, n, 1 ) ) --n;

    for ( const auto &row : a )
    {
        for ( size_t i = 0; i < n; i++ )
        {
            std::cout << row[i] << ' ';
        }
        std::cout << '\n';
    }

    std::cout << '\n';

    return 0;
}

程序输出是

A0 B0 C0 D0 E0 
A1 B1 C1 D1 E1 
A2 B2 C2 D2 E2 
A3 B3 C3 D3 E3 


B0 C0 D0 E0 
B1 C1 D1 E1 
B2 C2 D2 E2 
B3 C3 D3 E3 


B0 C0 D0 
B1 C1 D1 
B2 C2 D2 
B3 C3 D3 


B0 D0 
B1 D1 
B2 D2 
B3 D3 

或者函数可以用下面更简单的方式定义

template <typename T, size_t M, size_t N>
bool remove_column( T ( &a )[M][N], size_t n, size_t pos )
{
    bool success = n <= N && pos < n;

    if ( success )
    {
        for ( auto &row : a )
        {
            std::copy( std::next( std::begin( row ), pos + 1 ), 
                       std::next( std::begin( row ), n ),
                       std::next( std::begin( row ), pos ) );
        }
    }

    return success;
}

在这种情况下,标题 &lt;type_traits&gt; 是多余的。

您也可以使用算法std::move,而不是算法std::copy

【讨论】:

    【解决方案2】:

    不能“删除”数组的元素。数组的大小是恒定的。它从生命之初一直保持不变,直到它被销毁。 C++ 确实提供了一个名为 std::vector 的可调整大小的动态数组数据结构。

    你可以做的是将连续元素的内容复制到它们前面的兄弟元素上。实际上有一个标准算法:std::rotate。然而,Rotate 确实保留了所有元素的值;被覆盖的那个被旋转到最后。这不一定是您需要的,因此作为一个小的优化,您可以编写自己的算法,但不会这样做。

    对于多维数组,需要对每一行重复这个算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2021-12-30
      • 2016-11-27
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多