C ++ инициализирует все значения массива-члена для класса - PullRequest
3 голосов
/ 31 января 2012

Как в C ++ инициализировать все значения массива-члена для класса?

#define MAX_MATRIX 20
Class Matrix {
public:   
         Matrix(); //constructor
protected:
         int n[MAX_MATRIX];   // note cannot do = { 0} or w/e here
};

Matrix::Matrix()
{
     // how to set all n to -1?
}

Ответы [ 5 ]

6 голосов
/ 31 января 2012

Вы можете использовать std::fill:

std::fill(begin(n), end(n), -1);

(Эти begin и end функции можно найти в пространстве имен std в C ++ 11, или вы можете легко реализовать их самостоятельно в C ++ 03)

4 голосов
/ 31 января 2012

Это был явный недостаток C ++ 03.В C ++ 11 это было исправлено, и теперь вы можете инициализировать все, в том числе массивы:

class Matrix
{
public:   
     Matrix() : n { } { }
protected:
     static const unsigned int MAX_MATRIX = 20;
     int n[MAX_MATRIX];
};

(В C ++ неприятный макрос препроцессора также не требуется).

В C++ 03, вы просто не можете инициализировать элемент массива, но вы можете установить его значение в теле конструктора, например, через std::fill(n, n + MAX_MATRIX, 0);.

(Конечно, было бы намного лучше сказать std::array<int, MAX_MATRIX> n;.)

2 голосов
/ 31 января 2012

Для этого есть тип:

class Matrix {
public:
    Matrix() : n() { n.fill(-1); }
protected:
    std::array<int, 20> n;
};
0 голосов
/ 31 января 2012
#include <cstring>

...

Matrix::Matrix()
{
 static bool init=false;
 static int n_init[MAX_MATRIX];
 if (!init){
   for(int i=0; i<MAX_MATRIX; i++){
    n_init[i] = -1;
   }
  init = true;
 }
 memcpy(n,n_init,MAX_MATRIX*sizeof(int));
}

Массив n_init инициализируется ровно один раз и сохраняется в памяти, тогда все последующие конструкции являются быстрой копией памяти без циклов.Если вы увеличите размер MAX_MATRIX, вы не увидите значительного снижения скорости, как при циклическом просмотре индекса, особенно если вы звоните Matrix::Matrix() много раз.

0 голосов
/ 31 января 2012
for (unsigned i = 0; i < MAX_MATRIX; ++i) n[i] = -1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...