Problem mit std Vector - Übergabe

SuperSonik

Erfahrenes Mitglied
Hi,
Leute ich habe ein Problem mit der Übergabe
einer vector<vector<double> > Matrix.
Wie kann ich die Matrix an andere Funktionen übergeben, so dass ich in der Funktion weiterhin die Klassenfunktionen wie size() benutzen kann.
Ich hatte die Matrix vorher als int** übergeben, so wie ich es von C gewöhnt war.
Aber damit kann ich dann die Klassenfunktionen nicht mehr benutzen.
Code:
#include <iostream>
#include <vector>
using namespace std;


// Diese Funktion dient der Ausgabe 

void print_meinematrix( &vector<vector<double> > matrix , int dim1 , int dim2){

  for (int k = 0; k< dim1; k++){
    for (int t = 0; t < dim2; t++){
      cout << matrix[k*dim2+t] << '\t';
    }
  }
  cout << endl;

}


void mach_meinematrix( &vector<vector<double> > matrix , int dim1, int dim2){


  // laufen durch die Matrix:

  for (int i = 0; i<dim1; i++){
    for (int j = 0; j < dim2; j++){
    matrix[i*dim2+j]  = 10*i+j;
    }
  }

}



int main(void){

  vector<vector<double> > meinematrix(5,vector<double>(5));   // 5x5 - Matrix angelegt


  mach_meinematrix( meinematrix , 5, 5);


  
  print_meinematrix( meinematrix , 5, 5);

  return 0;
}

Ich hab gefunden, dass man eindimensionale Vektoren so übergibt:
vector<double> & meinvektor
Aber wie macht man das mehrdimensional
Gruß,

SuperSonik
 
Hi.

Grundsätzlich kannst du die Übergabe per Kopie (call-by-value) oder per Referenz bzw. Pointer (call-by-value) machen.

Also z.B. so:
Code:
void func (vector<vector<double> > matrix) { ... }
Das würde allerdings bei jedem Aufruf den Parameter kopieren. Um das zu vermeiden:
Code:
void func (vector<vector<double> >& matrix) { ... }
bzw.
Code:
void func (vector<vector<double> >* matrix) { ... }

Wenn du die matrix innerhalb der Funktion nicht veränderst, solltest du noch den Typ-Modifizierer const angeben.

Übrigens ist es meist einfacher und übersichtlicher statt des kompletten Typs mit den Template-Parametern sich ein typedef zu definieren:
Code:
typedef vector<vector<double> > Tmatrix;

Gruß
 
deepthroat hat gesagt.:
Hi.

Grundsätzlich kannst du die Übergabe per Kopie (call-by-value) oder per Referenz bzw. Pointer (call-by-value) machen.

Also z.B. so:
Code:
void func (vector<vector<double> > matrix) { ... }
Das würde allerdings bei jedem Aufruf den Parameter kopieren. Um das zu vermeiden:
Code:
void func (vector<vector<double> >& matrix) { ... }
bzw.
Code:
void func (vector<vector<double> >* matrix) { ... }

Wenn du die matrix innerhalb der Funktion nicht veränderst, solltest du noch den Typ-Modifizierer const angeben.

Übrigens ist es meist einfacher und übersichtlicher statt des kompletten Typs mit den Template-Parametern sich ein typedef zu definieren:
Code:
typedef vector<vector<double> > Tmatrix;

Gruß
Hallo,
erstmal danke für deine Hilfe.
Die drei Versionen die du vorschlägst habe ich auch schon ausprobiert.
Leider bekomme ich dann folgende Fehlermeldung meines Compilers
(in allen drei Fällen)
Code:
simplex.cpp: In function `void
   print_meinematrix(std::vector<std::vector<double, std::allocator<double> >,
   std::allocator<std::vector<double, std::allocator<double> > > >&, int, int)
   ':
simplex.cpp:12: error: no match for 'operator<<' in 'std::cout <<
   (+matrix)->std::vector<_Tp, _Alloc>::operator[] [with _Tp =
   std::vector<double, std::allocator<double> >, _Alloc =
   std::allocator<std::vector<double, std::allocator<double> > >](((k * dim2) +
   t))'
/usr/include/c++/3.3.5/bits/ostream.tcc:63: error: candidates are:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_ostream<_CharT,
   _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char,
   _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:74: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_ios<_CharT,
   _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits
   = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:86: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::ios_base&(*)(std::ios_base&)) [with _CharT = char,
   _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:122: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:156: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:98: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(bool) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:178: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(short int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:189: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:193: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:204: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:181: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long long int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:216: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:241: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(double) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:219: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(float) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:265: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long double) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:289: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(const void*) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:313: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT =
   char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:436: error:
   std::basic_ostream<_CharT, _Traits>&
   std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT =
   char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:512: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:447: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, signed char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:452: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, unsigned char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:572: error:
   std::basic_ostream<_CharT, _Traits>&
   std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) [with
   _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:616: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, const char*) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:486: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, const signed char*) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:491: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, const unsigned char*) [with _Traits = std::char_traits<char>]
simplex.cpp: In function `void mach_meinematrix(std::vector<std::vector<double,
   std::allocator<double> >, std::allocator<std::vector<double,
   std::allocator<double> > > >&, int, int)':
simplex.cpp:27: error: no match for 'operator=' in '(+matrix)->std::vector<_Tp,
   _Alloc>::operator[] [with _Tp = std::vector<double, std::allocator<double>
   >, _Alloc = std::allocator<std::vector<double, std::allocator<double> >
   >](((i * dim2) + j)) = ((i * 10) + j)'
/usr/include/c++/3.3.5/bits/vector.tcc:128: error: candidates are:
   std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const
   std::vector<_Tp, _Alloc>&) [with _Tp = double, _Alloc =
   std::allocator<double>]
frank@linux:~> ./run
simplex.cpp: In function `void
   print_meinematrix(std::vector<std::vector<double, std::allocator<double> >,
   std::allocator<std::vector<double, std::allocator<double> > > >*, int, int)
   ':
simplex.cpp:12: error: no match for 'operator<<' in 'std::cout << *(matrix +
   (+(((k * dim2) + t) * 12)))'
/usr/include/c++/3.3.5/bits/ostream.tcc:63: error: candidates are:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_ostream<_CharT,
   _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char,
   _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:74: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_ios<_CharT,
   _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits
   = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:86: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::ios_base&(*)(std::ios_base&)) [with _CharT = char,
   _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:122: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:156: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:98: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(bool) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:178: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(short int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:189: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:193: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:204: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:181: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long long int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:216: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:241: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(double) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:219: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(float) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:265: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long double) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:289: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(const void*) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:313: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT =
   char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:436: error:
   std::basic_ostream<_CharT, _Traits>&
   std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT =
   char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:512: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:447: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, signed char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:452: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, unsigned char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:572: error:
   std::basic_ostream<_CharT, _Traits>&
   std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) [with
   _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:616: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, const char*) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:486: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, const signed char*) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:491: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, const unsigned char*) [with _Traits = std::char_traits<char>]
simplex.cpp: In function `void mach_meinematrix(std::vector<std::vector<double,
   std::allocator<double> >, std::allocator<std::vector<double,
   std::allocator<double> > > >*, int, int)':
simplex.cpp:27: error: no match for 'operator=' in '*(matrix + (+(((i * dim2) +
   j) * 12))) = ((i * 10) + j)'
/usr/include/c++/3.3.5/bits/vector.tcc:128: error: candidates are:
   std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const
   std::vector<_Tp, _Alloc>&) [with _Tp = std::vector<double,
   std::allocator<double> >, _Alloc = std::allocator<std::vector<double,
   std::allocator<double> > >]
simplex.cpp: In function `int main()':
simplex.cpp:40: error: cannot convert `std::vector<std::vector<double,
   std::allocator<double> >, std::allocator<std::vector<double,
   std::allocator<double> > > >' to `std::vector<std::vector<double,
   std::allocator<double> >, std::allocator<std::vector<double,
   std::allocator<double> > > >*' for argument `1' to `void
   mach_meinematrix(std::vector<std::vector<double, std::allocator<double> >,
   std::allocator<std::vector<double, std::allocator<double> > > >*, int, int)'
simplex.cpp:45: error: cannot convert `std::vector<std::vector<double,
   std::allocator<double> >, std::allocator<std::vector<double,
   std::allocator<double> > > >' to `std::vector<std::vector<double,
   std::allocator<double> >, std::allocator<std::vector<double,
   std::allocator<double> > > >*' for argument `1' to `void
   print_meinematrix(std::vector<std::vector<double, std::allocator<double> >,
   std::allocator<std::vector<double, std::allocator<double> > > >*, int, int)'
Sorry, ist ziemlich lang.
Mein Compiler ist übrigens g++ oder gcc unter Suse 9.3
Gruß,

SuperSonik
 
Das liegt aber nicht an der Parameterübergabe sondern daran das du deinen 2 dimensionalen Vektor nicht richtig benutzt:

Code:
vector<vector<double> > vec2;
...
vec2[1][3];

Du mußt da nicht mehr selbst die Indizies ausrechnen.

Gruß
 
Übrigens kannst du dann natürlich die Angaben der Größe der Matrix als Parameter der Funktionen auch weglassen.
Code:
void func (const vector<vector<double> >& vec2) {
  int m = vec2.size ();
  int n = vec2[0].size (); // geht natürlich nur wenn vec2 nicht leer ist. also m != 0
}

Gruß
 
Zurück