Implementacja własnej klasy wektora
Ostatnio zmodyfikowano 2017-02-19 16:20
ParseThisCode Temat założony przez niniejszego użytkownika |
Implementacja własnej klasy wektora » 2017-02-19 05:07:05 Witam, eksperymentuję z własną klasą wektora i nie wiem czy dobrze to robię. template < class T > class Vector { public: T * array; int arr_size, capacity; Vector( int n_size = 0 ) : arr_size( n_size ) { array = new T[ arr_size ]; } size_t size() { return arr_size; } T & push_back( const T & t ) { if( arr_size > capacity ) resize(); array[ arr_size ] = t; arr_size++; } void resize() { T * backup = new T[ arr_size ]; backup = array; delete[] array; array = new T[ arr_size ]; array = backup; capacity = arr_size; } T & operator []( int i ) { return array[ i ]; } const T & operator []( int i ) const { return array[ i ]; }
|
|
j23 |
» 2017-02-19 10:05:48 Dlaczego array, arr_size i capacity jest publiczne? capacity nie ma wartości początkowej. Zresztą jaki jest sens tej zmiennej w twojej klasie? Tak nie kopiuje się tablic! Użyj std::copy. Przemyśl implementację resize, bo jest ... mocno nieprzemyślana (mówiąc delikatnie). p.s. Poczytaj o placement new, albo std::allocator. |
|
mateczek |
» 2017-02-19 10:27:37 eksperymentuję z własną klasą wektora i nie wiem czy dobrze to robię. | Skoro Ci nie działa to pewnie już sam wiesz że źle :P Ps. poniżej po korektach i małym kodem testującym #include<iostream> using namespace std;
template < class T > class mVector { T * array; int arr_size, actualSize; public: mVector( int n_size = 10 ) : arr_size( n_size ) { array = new T[ arr_size ]; actualSize = 0; } size_t size() { return actualSize; } void push_back( const T & t ) { if( actualSize >= arr_size ) { resize(); cout << "poszerzam tablice o 25%" << endl; } array[ actualSize++ ] = t; } void resize() { arr_size *= 1.25; T * temp = new T[ arr_size ]; for( int i = 0; i < actualSize; i++ ) temp[ i ] = array[ i ]; delete[] array; array = temp; } T & operator []( int i ) { return array[ i ]; } const T & operator []( int i ) const { return array[ i ]; } };
int main() { mVector < int > tablica; for( int i = 0; i < 20; i++ ) { tablica.push_back( i ); } for( size_t i = 0; i < tablica.size(); i++ ) { cout << tablica[ i ] << " "; } } |
|
ParseThisCode Temat założony przez niniejszego użytkownika |
» 2017-02-19 14:45:36 Yyyy, ale mój kod działa xD Pytałem tylko czy dobrze to robię, ale dzięki. |
|
mateczek |
» 2017-02-19 15:16:33 Yyyy, ale mój kod działa xD |
w tej wersji z góry nie ma prawa działać !!! #include<iostream>
template < class T > class Vector { public: T * array; int arr_size, capacity; Vector( int n_size = 0 ) : arr_size( n_size ) { array = new T[ arr_size ]; } size_t size() { return arr_size; } T & push_back( const T & t ) { if( arr_size > capacity ) resize(); array[ arr_size ] = t; arr_size++; } void resize() { T * backup = new T[ arr_size ]; backup = array; delete[] array; array = new T[ arr_size ]; array = backup; capacity = arr_size; } T & operator []( int i ) { return array[ i ]; } const T & operator []( int i ) const { return array[ i ]; } };
int main() { Vector < int > tablica; for( int i = 0; i < 20; i++ ) { tablica.push_back( i ); } for( size_t i = 0; i < tablica.size(); i++ ) { std::cout << tablica[ i ] << " "; } }
program daje taki output: 0 1 2 3 4 5 1041 0 540090416 540221490 540352564 825503793 891301920 959459380 909194288 808727840 875639346 891301945 892547124 875967794
|
|
ParseThisCode Temat założony przez niniejszego użytkownika |
» 2017-02-19 15:43:02 |
|
mateczek |
» 2017-02-19 16:20:33 masz wynik z kompilatora online https://ideone.com/m0gkta; void resize() { T * backup = new T[ arr_size ]; backup = array; delete[] array; array = new T[ arr_size ]; array = backup; capacity = arr_size; }
|
|
« 1 » |