Safi Ullah Ibne Sultan
Safi Ullah Ibne Sultan

Reputation: 622

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

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,array+size,12) sets all elements to 12 in a row only.I could't apply this for 2d array.Is there any way to do this using fill() or any way without direct initialization using double for loop

#include <iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
using namespace std;

int main()
{
   int arra[10][10];//declare 2d array

  for(int k=0;k<10;k++)//takes k's value 10 for 10 rows
     fill(arra,arra+10,45);//select a row and set all columns to 45 didn't work

}

array initialization http://www.fredosaurus.com/notes-cpp/arrayptr/array-initialization.html

Upvotes: 6

Views: 2311

Answers (4)

TAS
TAS

Reputation: 2079

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';
    }
}

Upvotes: 2

masterxilo
masterxilo

Reputation: 2778

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 

Upvotes: 1

max66
max66

Reputation: 66200

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;
 }

Upvotes: 1

erip
erip

Reputation: 16935

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.

Upvotes: 4

Related Questions