繁体   English   中英

如何在C ++中删除2D数组中的列

[英]How to delete a column in 2d array in c++

我在c ++中有一个基本的2d数组。 我想删除特定的列,然后将下一列放在其位置。 我的数组是NAME [] TMARKS [] FNAME [] REG#[]
名称和FNAME在第一2d数组(字符串)中,而Tmark和reg#在第二2d数组(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 ++确实提供了可调整大小的动态数组数据结构,名称为std::vector

您可以做的是将连续元素的内容复制到其先前的同级对象上。 实际上,有一个标准算法可以实现: std::rotate 但是Rotate确实保留了所有元素的值; 被覆盖的那个被旋转到最后。 这不一定是您所需要的,因此,作为次要的优化,您可以编写自己的算法来做到这一点。

对于多维数组,您需要为每一行重复此算法。

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

这是一个演示程序。 在程序中,变量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;
}

在这种情况下,标头<type_traits>是多余的。

同样,可以使用算法std::move代替算法std::copy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM