如何设置或初始化表或二维数组或多维数组的所有元素的默认值

时间:2016-05-04 11:49:28

标签: c++ arrays

我想为表或2d数组的所有元素设置默认非零值。 array [size] = {12}设置第一个元素只有12个而其他元素都是0连续。但是fill(array,array + size,12)将所有元素设置为仅连续12个。我无法应用这对于2d数组。有没有办法用fill()或任何方式来做这个没有直接初始化使用double for循环

#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

4 个答案:

答案 0 :(得分:2)

与使用1维数组几乎相同:

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

注意:第一个索引不需要值。在这种情况下,编译器将自动计算此索引。

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

修改

避免双循环的替代方案是:

## 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 :(得分:1)

对于C数组,您可能希望使用memset。但是,您已将此标记为C ++,因此我觉得有必要给出一个C ++答案:

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

这会创建一个大小为10的std::vector 10 std::vector<int>个,每个元素初始化为45个。

请参阅here了解。

答案 2 :(得分:1)

解决方案(不是很优雅,我知道)可以

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

或使用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;
 }

答案 3 :(得分:1)

这并不比memset好多少,但至少可以为每个int指定值而不是每个字节使用std :: fill,如下所示:

#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