gpt4 book ai didi

c++ - 如何在 C++ 中删除二维数组中的列

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:35:53 25 4
gpt4 key购买 nike

我在 C++ 中有一个基本的二维数组。我想删除一个特定的列并将下一列放在它的位置。我的阵列是名称[ ] 商标[ ]FNAME[ ] REG#[ ]
名称和 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.

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

最佳答案

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

这是一个演示程序。在程序中变量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::copy你可以使用算法 std::move .

关于c++ - 如何在 C++ 中删除二维数组中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57890041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com