C++ 如何用c++;有价值吗?

C++ 如何用c++;有价值吗?,c++,c++11,visual-c++,c++14,C++,C++11,Visual C++,C++14,我有一个大小为a和b的矩阵 int矩阵[a][b] 我怎样才能用任何值填充它 感谢您回答我的问题。您可以使用嵌套循环来填充或读取多维矩阵: int matrix [a] [b]; for(int i(0); i != a; ++i) for(int j(0); j != b; ++j) matrix[i][j] = i * j; 或者用用户的输入填充它: for(int i(0); i != a; ++i) for(int j(0); j != b; ++j)

我有一个大小为
a
b
的矩阵

int矩阵[a][b]

我怎样才能用任何值填充它


感谢您回答我的问题。

您可以使用嵌套循环来填充或读取多维矩阵:

int matrix [a] [b];

for(int i(0); i != a; ++i)
    for(int j(0); j != b; ++j)
        matrix[i][j] = i * j;
或者用用户的输入填充它:

for(int i(0); i != a; ++i)
    for(int j(0); j != b; ++j){
        std::cout << "matrix[" << i << "][" << j <<
            "]: ";
        std::cin >> matrix[i][j];
    }
for(int i(0);i!=a;++i)
对于(int j(0);j!=b;++j){

std::cout您可以嵌套循环来填充或读取多维矩阵:

int matrix [a] [b];

for(int i(0); i != a; ++i)
    for(int j(0); j != b; ++j)
        matrix[i][j] = i * j;
或者用用户的输入填充它:

for(int i(0); i != a; ++i)
    for(int j(0); j != b; ++j){
        std::cout << "matrix[" << i << "][" << j <<
            "]: ";
        std::cin >> matrix[i][j];
    }
for(int i(0);i!=a;++i)
对于(int j(0);j!=b;++j){

std::cout最简单的方法是将二维数组解释为一维数组,并应用标准算法
std::fill

比如说

#include <iostream>
#include <algorithm>

int main() 
{
    const size_t M = 5;
    const size_t N = 10;
    int a[M][N];

    std::cout << "Enter the initializer value: ";
    int value;
    std::cin >> value;

    std::fill( *a, *a + M * N, value );

    for ( const auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }


    return 0;
}

最简单的方法是将二维数组解释为一维数组,并应用标准算法
std::fill

比如说

#include <iostream>
#include <algorithm>

int main() 
{
    const size_t M = 5;
    const size_t N = 10;
    int a[M][N];

    std::cout << "Enter the initializer value: ";
    int value;
    std::cin >> value;

    std::fill( *a, *a + M * N, value );

    for ( const auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }


    return 0;
}

您标记了C++14以便可以使用双范围循环

for ( auto & v : matrix )
   for ( auto & e : v )
      e = 42;
在我看来,这是一种初始化矩阵的简单而优雅的方法

为了好玩,我向您展示了一种使用标准算法的方法

std::for_each(std::begin(matrix), std::end(matrix),
   [](auto & v){ std::fill(std::begin(v), std::end(v), 42); });
其他方法也是可能的(例如,请参见Vlad答案中的
std::fill()
唯一解决方案),但我发现嵌套的double更优雅、更容易理解

请记住,如果必须初始化为零,则只需编写

int matrix [4][2] { };

您标记了C++14以便可以使用双范围循环

for ( auto & v : matrix )
   for ( auto & e : v )
      e = 42;
在我看来,这是一种初始化矩阵的简单而优雅的方法

为了好玩,我向您展示了一种使用标准算法的方法

std::for_each(std::begin(matrix), std::end(matrix),
   [](auto & v){ std::fill(std::begin(v), std::end(v), 42); });
其他方法也是可能的(例如,请参见Vlad答案中的
std::fill()
唯一解决方案),但我发现嵌套的double更优雅、更容易理解

请记住,如果必须初始化为零,则只需编写

int matrix [4][2] { };

使用嵌套循环。例如:
for(int i=0;i
使用嵌套循环。例如:
for(int i=0;i
非常好(当我尝试类似的方法时,我会在指针上出错)。但是(IMHO)您应该添加一点关于
std::fill(*a,*a+M*N,value)的解释;
这是错误的,您必须执行其他操作才能使用二维数组…
std::fill
不能保证这样做,因为
*a
是数组的数组,所以它的增量将指向矩阵的下一行。从ISO标准的角度来看,表达式
*a+M*N
是指向arr外部位置的指针因为数组的最后一个元素是
*a+N-1
@Swift-“因为
*a
是数组的数组”,嗯……不;据我所知,
a
,而不是
*a
,是数组的数组,可以等同于指向指针的指针;所以
*a
可以等同于简单指针(在这种情况下,
int
);因此(考虑到数组在内存中是顺序的)
*a+M*N
应该是
a
之外的第一个位置,而不是太远。我看到Vlad答案中的缺陷对于新手来说有点模糊(而且,对专家来说,也是危险的);但对我来说似乎是正确的。@max66实现方面可能是正确的,但在标准中它是UB。我的意思是
a
,而不是
*a
*a
是指向第一行的指针,
int[N]从C++内存模型的视图 *A+M*N不是指向整个数组后面的元素,它指向矩阵的第一行之后的M*N-Th元素。,我们从不获取任何东西的地址。@Swift你错了。在这个表达式中,*a+MN*a被转换为指向数组第一个元素的指针。也就是说,表达式*a的类型为int[10],在表达式*a+MN中被转换为int*类型非常好(当我尝试类似的东西时,我在指针上会犯错误)。但是(IMHO)您应该添加一点关于
std::fill(*a,*a+M*N,value)的解释;
这是错误的,您必须执行其他操作才能使用二维数组…
std::fill
不能保证这样做,因为
*a
是数组的数组,所以它的增量将指向矩阵的下一行。从ISO标准的角度来看,表达式
*a+M*N
是指向arr外部位置的指针因为数组的最后一个元素是
*a+N-1
@Swift-“因为
*a
是数组的数组”,嗯……不;据我所知,
a
,而不是
*a
,是数组的数组,可以等同于指向指针的指针;所以
*a
可以等同于简单指针(在这种情况下,
int
);因此(考虑到数组在内存中是顺序的)
*a+M*N
应该是
a
之外的第一个位置,而不是太远。我看到Vlad答案中的缺陷对于新手来说有点模糊(而且,对专家来说,也是危险的);但对我来说似乎是正确的。@max66实现方面可能是正确的,但在标准中它是UB。我的意思是
a
,而不是
*a
*a
是指向第一行的指针,
int[N]从C++内存模型的视图 *A+M*N不是指向整个数组后面的元素,它指向矩阵的第一行之后的M*N-Th元素。,我们从不获取任何内容的地址。@Swift您错了。在此表达式中,*a+MN*a转换为指向数组第一个元素的指针。也就是说,表达式*a的类型为int[10],在表达式*a+MN中转换为int*类型