【问题标题】:how can i fill a matrix in c++ with a value?如何用值填充 C++ 中的矩阵?
【发布时间】:2018-09-03 09:35:29
【问题描述】:

我有一个大小为 ab 的矩阵。

int matrix [a] [b]

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

感谢您回答我的问题。

【问题讨论】:

  • 使用嵌套循环。
  • 像这样:for (int i = 0; i < a; i++) for (int j = 0; j < b; j++) matrix[i][j] = 0;

标签: c++ c++11 visual-c++ c++14


【解决方案1】:

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

for ( auto & v : matrix )
   for ( auto & e : v )
      e = 42;

在我看来,初始化matrix 是一种简单而优雅的方式。

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

std::for_each(std::begin(matrix), std::end(matrix),
   [](auto & v){ std::fill(std::begin(v), std::end(v), 42); });

其他方式也是可能的(例如,请参阅弗拉德答案中的 std::fill() only 解决方案),但我发现嵌套双精度更高且更易于理解。

记住,如果你必须初始化为零,你可以简单地写

int matrix [4][2] { };

【讨论】:

    【解决方案2】:

    最简单的方法是将二维数组解释为一维数组并应用标准算法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;
    }
    

    程序输出可能看起来像

    Enter the initializer value: 10
    10 10 10 10 10 10 10 10 10 10 
    10 10 10 10 10 10 10 10 10 10 
    10 10 10 10 10 10 10 10 10 10 
    10 10 10 10 10 10 10 10 10 10 
    10 10 10 10 10 10 10 10 10 10 
    

    【讨论】:

    • 非常好(当我尝试类似的事情时,我曾经犯过指针错误)。但是(恕我直言)你应该添加一些关于std::fill( *a, *a + M * N, value );的解释
    • 这是错误的,您必须执行额外的操作才能使用二维数组...std::fill 不保证可以正常工作,因为*a 是数组数组,所以它的增量会指向矩阵的下一行。 从 ISO 标准的观点表达 *a+M*N 是指向数组外部位置的指针,因为该数组的最后一个元素是*a + N - 1
    • @Swift - “因为*a 是数组数组”,嗯……不;据我所知,a,而不是*a,是一个数组数组,可与指向指针的指针等价;所以*a 等同于一个简单的指针(在这种情况下是int);所以(考虑到数组的数组在内存中是连续的)*a+M*N 应该是a 之外的 first 位置,而不是太多。我看到弗拉德回答中的缺陷对于新手来说有点晦涩难懂(恕我直言,对专家来说也很危险);但在我看来这是正确的。
    • @max66 在实现方面可能是正确的,但在标准中它是一个 UB。我的意思是a,而不是*a*a 是指向第一行的指针,int[N]。从 C++ 内存模型的角度来看,*a+M*N 不是指向整个数组后面的元素,而是指向矩阵第一行之后的第 M*N 个元素。以现在的使用方式,我们无法保证编译器将如何实现 a[M][N] 的存储,我们从不获取任何地址。
    • @Swift 你错了。在这个表达式中 * a+MN * a 被转换为指向数组第一个元素的指针。即表达式 * a 的类型为 int[10[ ,它在表达式 * a + MN 中转换为 int * 类型
    【解决方案3】:

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

    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){
        for(int j(0); j != b; ++j)
            std::cout << matrix[i][j] << ", ";
        std::cout << std::endl;
    }
    

    【讨论】:

      【解决方案4】:

      你可以使用memset函数

      int matrix[n+1][n+1];
      memset(matrix,0,sizeof(dp));`
      

      【讨论】:

      • 这是不正确的。矩阵的元素是整数,这仅在您使用 memset 将整数的字节设置为 0 时偶然起作用。这在设置其他值时不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 2015-12-20
      • 2014-11-19
      相关资源
      最近更新 更多