2016-05-04 17 views
6

テーブルまたは2次元配列のすべての要素にデフォルトの非ゼロ値を設定したいとします。 array [size] = {12}は最初の要素を12に設定し、他の要素はすべてrow.Butでfill(array、array + size、12)はすべての要素を12行に設定します。 2D array.Isそこがいっぱい使ってこれを行うにはどのような方法()またはループのためテーブルまたは2次元配列または多次元配列のすべての要素のデフォルト値を設定または初期化する方法

#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 

} 

配列の初期化 http://www.fredosaurus.com/notes-cpp/arrayptr/array-initialization.html

+1

[memset()](http://stackoverflow.com/questions/13327155/memset-definition-and-use)を使用することをお勧めします。 –

+0

生の配列を使用しないでください。 – erip

答えて

2

ほぼ同じように、二重使用して直接初期化せずに任意の方法1-と、あなたと同じように2次元配列:

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

注:最初のインデックスはrではありません値を指定します。その場合、コンパイラは自動的にこのインデックスを計算します。

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

EDIT

重ループを避けることができます代替がある:Cアレイの

## 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'; 
    } 
} 
+1

しかし、配列のサイズが100 * 100であれば、それらを個別に設定するのが難しいと思います。 –

1

、あなたはおそらくmemsetを使用したいと思います。あなたはしかし、C++としてこれをマークしたので、私はC++答えを与えることが義務付け感じる:

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

これは45

見るために初期化され、各要素とのサイズ10の10 std::vector<int>秒のstd::vectorを作成し、 ideoneの場合はhereです。

1

溶液(本当にエレガントではない、私は知っている)

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

または、---- EDIT ----

std::fill()

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

を使用することができ例

#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

私はC++ 11を使用しています。自動でエラーが表示されます –

+0

'auto'(その文脈で)はC++ 11です特徴。エラーを表示できますか?完全な例を追加しました。 – max66

+0

C:¥Users¥USER¥Desktop¥ffdg.cpp¥main。cpp | 8 | warning: 'auto'はC++ 11の意味を変更します。それを削除してください[-WC++ 0x-compat] | –

1

これはmemsetのよりもはるかに良いではありませんが、少なくともあなたは、それぞれがSTDではなく、各バイトをint型の値を指定することができます::そのように使用される塗り:

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

これは、配列要素が内で連続しているに依存していますメモリ。

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