[C++] Zweidimensionales Array füllen

Gast #1971405
Lesenswert?

Liebes Forum,

ich habe in C++ eine Klasse für ein zweidimensionales Array 
implementiert und kann diese auch benutzen:

twodim var(2, 2);
var[0][0] = 0;

und so weiter.

Nun ist es mir aber etwas zu umständlich, beispielsweise eine 
5x5-Tabelle immer nach diesem Muster zu füllen. In den Sinn kommt mir, 
eine solche Syntax verwendbar zu machen:

int x[5][5] = {
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5},
}

Kann ich jetzt mit irgendeinem {Assignment-,}Operator sowas emulieren? 
Das Problem ist, dass 5x5 beliebig mxn sein soll.

Gruß,
Nico
#1971471
Lesenswert?

Was ich im Kopf hatte, sind die "compound literals" aus C99,
die der gcc bzw. g++ auch bei C++ akzeptiert, zusammen mit
einem entsprechenden ctor in der Klasse.

Ich hatte mir das so vorgestellt:
1
class Matrix
2
{
3
 public:
4

5
  Matrix( size_t m, size_t n, double arr[m][n] )
6
    : m( m ),
7
      n( n ),
8
      pWerte( new double[m*n] )
9
  {
10
    for( size_t i=0; i<m; ++i )
11
    {
12
      for( size_t j=0; j<n; ++j )
13
      {
14
        pWerte[i*n+j] = arr[i][j];
15
      }
16
    }
17
  }
18

19
  double &operator()( size_t i, size_t j )
20
  {
21
    return pWerte[i*n+j];
22
  }
23

24
 private:
25

26
  size_t     m;
27
  size_t     n;
28
  double    *pWerte;
29

30
}; // class Matrix
31

32
...
33
  Matrix    m( 3, 2,
34
               (double[3][2])
35
               {
36
                  { 1.0, 2.0 },
37
                  { 1.1, 2.1 },
38
                  { 1.1, 2.1 }
39
               }
40
               );

Das geht nur leider nicht so, weil im ctor der
Parameter double arr[m][n] nicht akzeptiert wird, wegen noch
unbekannten m und n.

Wenn man auf die zeilenweise Klammerung der Matrix beim Initialisieren 
verzichten kann, geht es zumindest so:
1
#include <iostream>
2

3
class Matrix
4
{
5
 public:
6

7
  Matrix( size_t m, size_t n )
8
    : m( m ),
9
      n( n ),
10
      pWerte( new double[m*n] )
11
  {
12
  }
13

14
  Matrix( size_t m, size_t n, double *arr )
15
    : m( m ),
16
      n( n ),
17
      pWerte( new double[m*n] )
18
  {
19
    for( size_t i=0; i<m; ++i )
20
    {
21
      for( size_t j=0; j<n; ++j )
22
      {
23
        pWerte[i*n+j] = arr[i*n+j];
24
      }
25
    }
26
  }
27

28
  double &operator()( size_t i, size_t j )
29
  {
30
    return pWerte[i*n+j];
31
  }
32

33
 private:
34

35
  size_t     m;
36
  size_t     n;
37
  double    *pWerte;
38

39
}; // class Matrix
40

41
int main( int nargs, char **args )
42
{
43
  Matrix    m( 3, 2,
44
               (double[])
45
               {
46
                  1.0, 2.0,
47
                  1.1, 2.1,
48
                  1.1, 2.1
49
               }
50
               );
51

52

53
  std::cout << "m( 2, 1 ) = " << m( 2, 1 ) << std::endl;
54
}

Das sieht schon etwas ähnlicher aus wie eine array-Initialisierung
in C.
Etwas eleganteres sehe ich spontan nicht, sorry.
Moderator #1971496
Lesenswert?

Keine fertige Lösung, aber ein Ansatz:

Schau die mal die Boost-Assignment-Library an. Da werden durch Überladen
des ()- und des ,-Operators verrückteste Dinge gemacht, die noch weit
über das hinausgehen, was du vor hast, und das alles standardkonform:

  http://www.boost.org/doc/libs/1_45_0/libs/assign/doc/index.html

Ich habe sie mir nicht näher angeschaut, aber mit etwas Glück arbeitet
die Library direkt mit deiner Klasse zusammen, mit etwas weniger Glück
kannst du sie mittels weiterer Überladungen passend machen. Falls das
alles nicht funktionieren sollte, kannst du zumindest die Grundideen
übernehmen und etwas Ähnliches selbst schreiben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren