问题描述
我正在尝试用 C++ 完成任务。我需要创建这个函数:
void fillArray(std::array<std::array<int,maxColumns>,maxRows> array,size_t rows,size_t columns) {
}
现在我的示例代码如下所示:
#include <iostream>
#include <array>
constexpr int maxColumns = 42;
constexpr int maxRows = 334;
void fillArray(std::array<std::array<int,size_t columns) {
}
int main()
{
}
我需要用从 1 到行*列的数字填充数组,从 [0][0] 和对角线开始。本例中如何用数组声明和初始化函数,然后对角填充?任何帮助将不胜感激!
解决方法
应该是
template <std::size_t maxColumns,std::size_t maxRows>
void fillArray(std::array<std::array<int,maxColumns>,maxRows>& array) {
// ...
}
,
假设您使用一个简单的一维 valarray(或数组,如果您坚持),其大小 width * height 包裹在一个类中:
class Matrix
{
private:
std::valarray<int> _data;
int _width,_height;
public:
Matrix(int width,int height) : _width(width),_height(height),_data(width * height)
{
}
}
然后你可以添加一个成员函数,将 x、y 坐标映射到一个项目引用:
int& item(int x,int y) { return _data[x + _width * y]; }
... 和另一个像这样对角填充它:
void fillDiagonally(int value = 0,int step = 1)
{
for (int i = 0; i < _height + _width; ++i) {
// calculate starting coordinates (along left edge and then bottom edge)
int row = i < _height ? i : _height - 1;
int col = i < _height ? 0 : i - _height + 1;
// move diagonally up and right until you reach margins,while filling-in values
for (int j = 0; j < _width - col && j <= row; ++j) {
item(col + j,row - j) = value;
value += step;
}
}
}
并像这样使用它:
int main()
{
Matrix m(8,5);
m.fillDiagonally(1);
}
这样,您不需要将数组作为参数传递,因为它是类的一部分。否则,您将不得不通过引用传递它,就像上面建议的那样。