how to set or initialize default value for all elements of a table or 2d array or multdimentional array

后端 未结 4 834
北恋
北恋 2020-12-11 05:18

I want to set a default nonzero value for all elements of a table or 2d array. array[size]={12} sets first elements only 12 and others are all 0 in a row.But fill(array,arra

相关标签:
4条回答
  • 2020-12-11 05:52

    A solution (not really elegant, I know) can be

    for ( auto & row : arra )
       for ( auto & elem : row )
          elem = 45;
    

    or, using std::fill()

    for ( auto & row : arra )
       std::fill(std::begin(row), std::end(row), 45);
    

    ---- EDIT ----

    Full example

    #include <iostream>
    
    int main ()
     {
       int a[10][10];
    
       // mode A
       for ( auto & row : a )
          for ( auto & elem : row )
             elem = 45;
    
       // mode B
       for ( auto & row : a )
          std::fill(std::begin(row), std::end(row), 47);
    
       for ( int i = 0 ; i < 10 ; ++i ) 
        {
          for ( int j = 0 ; j < 10 ; ++j )
             std::cout << '[' << a[i][j] << ']';
    
          std::cout << '\n';
        }
    
       return 0;
     }
    
    0 讨论(0)
  • 2020-12-11 05:55

    This is not much better than memset, but at least you can specify the value for each int instead of each byte with std::fill used like that:

    #include <algorithm>
    #include <stdio.h>
    
    int main() {
       int arra[10][10];
       std::fill((int*)arra,(int*)arra+sizeof(arra)/sizeof(int),45);
    
       for (auto& row : arra) {
         for (auto& x : row)
           printf("%d ", x);
         puts("");
       }
    
       return 0;
    }
    

    This relies on the array elements being contiguous in memory.

    45 45 45 45 45 45 45 45 45 45 
    45 45 45 45 45 45 45 45 45 45 
    45 45 45 45 45 45 45 45 45 45 
    45 45 45 45 45 45 45 45 45 45 
    45 45 45 45 45 45 45 45 45 45 
    45 45 45 45 45 45 45 45 45 45 
    45 45 45 45 45 45 45 45 45 45 
    45 45 45 45 45 45 45 45 45 45 
    45 45 45 45 45 45 45 45 45 45 
    45 45 45 45 45 45 45 45 45 45 
    
    0 讨论(0)
  • 2020-12-11 05:58

    Almost the same way as you would with a 1-dimensional array:

    #include <iostream>
    #include <iomanip>
    
    int main() {
        int arr[10][10] = {
            {  1,  2,  3,  4,  5,  6,  7,  8,  9, 10 },
            {  2,  4,  6,  8, 10, 12, 14, 16, 18, 20 },
            {  3,  6,  9, 12, 15, 18, 21, 24, 27, 30 },
            {  4,  8, 12, 16, 20, 24, 28, 32, 36, 40 },
            {  5, 10, 15, 20, 25, 30, 35, 40, 45, 50 },
            {  6, 12, 18, 24, 30, 36, 42, 48, 54, 60 },
            {  7, 14, 21, 28, 35, 42, 49, 56, 63, 70 },
            {  8, 16, 24, 32, 40, 48, 56, 64, 72, 80 },
            {  9, 18, 27, 36, 45, 54, 63, 72, 81, 90 },
            { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }
        };
    
        for(int i=0; i<10; ++i) {
            for(int j=0; j<10; ++j) {
                std::cout << std::setw(4) << arr[i][j];
            }
            std::cout << '\n';
        }
    }
    

    NOTE: The first index does not require a value. In that case the compiler will automatically calculate this index.

    int arr[][10] = { ... };
    

    EDIT

    An alternative that will avoid a double loop is:

    ## Heading ###include <iostream>
    #include <iomanip>
    
    
    int main() {
        int arr[10][10] = {}; // Initializes all values to 0
        for(int i=0; i<10; ++i ) arr[i][0] = 12;
    
        for(int i=0; i<10; ++i) {
            for(int j=0; j<10; ++j) {
                std::cout << std::setw(4) << arr[i][j];
            }
            std::cout << '\n';
        }
    }
    
    0 讨论(0)
  • 2020-12-11 06:17

    For C arrays, you'll probably want to use memset. You've marked this as C++, though, so I feel obliged to give a C++ answer:

    std::vector<std::vector<int>> v(10, std::vector<int>(10, 45));
    

    This creates a std::vector of 10 std::vector<int>s of size 10 with each element initialized to 45.

    See here for the ideone.

    0 讨论(0)
提交回复
热议问题