Matrix Klasse mit Vectoren
-
private: int dim1; int dim2; //das hier vector< vector<int> > mat(dim1);
-
vector< vector<int> > mat(dim1);Ist es das dim1 von kurz drueber? Welchen Typ hat dim1 im Konstruktor? Sicher?
Btw. ich implementiere 2D-Arrays meist ueber 1D-Arrays, da ich sonst immer durcheinander komme, was jetzt Zeile und was Spalte war. Ueberlade dementsprechend operator().
-
Achja.. Das habe ich völlig übersehen. Die Konstruktion kannst du natürlich nicht in der Klassendefinition machen. Dafür wäre die Initialisierungsliste da.
und btw:
Dekonstruktor
Das ist der destructor oder auf Deutsch Destruktor.
@knivil:
Inwiefern meinst du das? - Schlussendlich musst du ja auch irendwo jeweils wissen, was Zeile und was Spalte ist.
-
private: int dim1,dim2; //unnötig... zu erreichen unter dim1=mat.size() bzw. dim2=mat[x].size() vector< vector<int> > mat; //nix mit klammern!bb
-
wäre es eigentlich besser, sowas zu machen:
vector<int*> mat
oder irgendwas ähnliches?
sorry, weiß auch nicht genau was ich will.
Hab nur gehört, dass vector in vector nicht so gut ist.
Die Idee es ins eindimensionale flachzukopieren, hab ich mir schon angeschaut, aber suche noch eine andere lösung.also vielleicht vektor mit zeigern..?
oder ist das eigentlich auch nicht gut.
-
Ist eine andere Möglichkeit, aber imo sinnfrei, wenn du dann die ints selbst dynamisch verwaltest.. Dann kannst du das gleich für das ganze so machen..
Was spricht den gegen vector von vector? - Ansonsten kannst du es ja so machen:
std::vector v ( height * width );Und dann halt beim Zugriff das selbst berechnen welches Element du schlussendlich willst.
-
Ein Hinweis nebenbei: der Container std::valarray könnte sich für numerische Operationen besser eignen als std::vector.
Gruß Kimmi
-
Habe ein ähnliches Problem.
Würde sich valarray auch bei großen Datentypen, wie z.B. aus gmp, auch besser eignen?
Was hätte eine bessere Preformance?
-
Matrix(int d1, int d2) : mat(d1, std::vector<int>(d2)){}
-
Welche Vorteile hat in diesem Fall ( Matrizen sind meistens von konstanter Länge ) eigentlich die Verwendung von std::vector?
früher gabs da mal so dinge wie new und delete...
*sich auf den Kritik-hagel vorbereitet*
-
leider funktioniert mit gmp (mpq_t) das nicht:
Matrix(int d1, int d2) : mat(d1, std::vector<mpq_t>(d2)){}wahrscheinlich muss ich sowas wie laraM vorgeschlagen hat machen:
vector<mpq_t*> matmachen.
und dann auch über new und delete gehen oder?
Hat einer sowas schonmal gemacht?
-
Was funktioniert nicht?
-
Matrix(int d1, int d2) : mat(d1, std::vector<mpq_t>(d2)){}‘std::vector<_Tp, _Alloc>::vector(size_t, const _Tp&, const _Alloc&) [with _Tp = __mpq_struct [1], _Alloc = std::allocator<__mpq_struct [1]>]’: error: conversion from ‘int’ to non-scalar type ‘__mpq_struct [1]’ requested /usr/include/c++/4.3/bits/stl_construct.h: In function ‘void std::_Destroy(_Tp*) [with _Tp = __mpq_struct [1]]’: /usr/include/c++/4.3/bits/stl_construct.h:103: instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = __mpq_struct (*)[1]]’ /usr/include/c++/4.3/bits/stl_construct.h:128: instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator, std::allocator<_T2>&) [with _ForwardIterator = __mpq_struct (*)[1], _Tp = __mpq_struct [1]]’ /usr/include/c++/4.3/bits/stl_vector.h:300: instantiated from ‘std::vector<_Tp, _Alloc>::~vector() [with _Tp = __mpq_struct [1], _Alloc = std::allocator<__mpq_struct [1]>]’ich denke das hat was damit zu tun, das ich den ersten vector erst mit mpq_init() aufrufen müßte, bevor ich zweite Dimension einfügen kann, oder?
-
Kann es sein dass die Membervariable "mat" noch vom Typ vector<vector<int> > ist?
-
class Matrix { public: Matrix(); Matrix(int rows, int cols): mat(rows, vector<mpq_t>(cols)){}; private: vector< vector<mpq_t> > mat; };hmm
-
Es klappt auch schon eindimensional nicht:
class Matrix { public: Matrix(); Matrix(int rows): mat(rows){}; private: vector<mpq_t > mat; };selbe Fehlermeldung:
../Matrix.h: In constructor ‘std::vector<_Tp, _Alloc>::vector(size_t, const _Tp&, const _Alloc&) [with _Tp = __mpq_struct [1], _Alloc = std::allocator<__mpq_struct [1]>]’: ../Matrix.h:20: error: conversion from ‘int’ to non-scalar type ‘__mpq_struct [1]’ requested /usr/include/c++/4.3/bits/stl_construct.h: In function ‘void std::_Destroy(_Tp*) [with _Tp = __mpq_struct [1]]’: /usr/include/c++/4.3/bits/stl_construct.h:103: instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = __mpq_struct (*)[1]]’ /usr/include/c++/4.3/bits/stl_construct.h:128: instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator, std::allocator<_T2>&) [with _ForwardIterator = __mpq_struct (*)[1], _Tp = __mpq_struct [1]]’ /usr/include/c++/4.3/bits/stl_vector.h:300: instantiated from ‘std::vector<_Tp, _Alloc>::~vector() [with _Tp = __mpq_struct [1], _Alloc = std::allocator<__mpq_struct [1]>]’ ../Matrix.h:20: instantiated from here /usr/include/c++/4.3/bits/stl_construct.h:88: error: request for member ‘~__mpq_struct [1]’ in ‘* __pointer’, which is of non-class type ‘__mpq_struct [1]’ /usr/include/c++/4.3/bits/stl_algobase.h: In function ‘typename __gnu_cxx::__enable_if<(! std::__is_scalar::__value), _OutputIterator>::__type std::__fill_n_a(_OutputIterator, _Size, const _Tp&) [with _OutputIterator = __mpq_struct (*)[1], _Size = unsigned int, _Tp = __mpq_struct [1]]’: /usr/include/c++/4.3/bits/stl_algobase.h:784: instantiated from ‘_OI std::fill_n(_OI, _Size, const _Tp&) [with _OI = __mpq_struct (*)[1], _Size = unsigned int, _Tp = __mpq_struct [1]]’ /usr/include/c++/4.3/bits/stl_uninitialized.h:209: instantiated from ‘static void std::__uninitialized_fill_n<true>::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = __mpq_struct (*)[1], _Size = unsigned int, _Tp = __mpq_struct [1]]’ /usr/include/c++/4.3/bits/stl_uninitialized.h:228: instantiated from ‘void std::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = __mpq_struct (*)[1], _Size = unsigned int, _Tp = __mpq_struct [1]]’ /usr/include/c++/4.3/bits/stl_uninitialized.h:323: instantiated from ‘void std::__uninitialized_fill_n_a(_ForwardIterator, _Size, const _Tp&, std::allocator<_Tp2>&) [with _ForwardIterator = __mpq_struct (*)[1], _Size = unsigned int, _Tp = __mpq_struct [1], _Tp2 = __mpq_struct [1]]’ /usr/include/c++/4.3/bits/stl_vector.h:976: instantiated from ‘void std::vector<_Tp, _Alloc>::_M_fill_initialize(size_t, const _Tp&) [with _Tp = __mpq_struct [1], _Alloc = std::allocator<__mpq_struct [1]>]’ /usr/include/c++/4.3/bits/stl_vector.h:236: instantiated from ‘std::vector<_Tp, _Alloc>::vector(size_t, const _Tp&, const _Alloc&) [with _Tp = __mpq_struct [1], _Alloc = std::allocator<__mpq_struct [1]>]’ ../Matrix.h:20: instantiated from here /usr/include/c++/4.3/bits/stl_algobase.h:741: error: invalid array assignmentschade.. kennt einer einen ausweg
(sorry LaraM, hätte einen eigenen Beitrag aufmachen sollen
)EDIT: Ich habe einen eigenen Beitrag aufgemacht!