Reputation: 622
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
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
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
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
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