Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Implementacja własnej klasy wektora

Ostatnio zmodyfikowano 2017-02-19 16:20
Autor Wiadomość
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ę.

C/C++
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 ];
    }
P-158002
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?

backup = array;
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.
P-158003
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
C/C++
#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 ] << " ";
    }
   
}
P-158004
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.
P-158011
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ć !!!

C/C++
#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
P-158012
ParseThisCode
Temat założony przez niniejszego użytkownika
» 2017-02-19 15:43:02
U mnie taki:

P-158014
mateczek
» 2017-02-19 16:20:33
masz wynik z kompilatora online
https://ideone.com/m0gkta;
C/C++
void resize() {
    T * backup = new T[ arr_size ]; //rezerwacja pamiięci
    backup = array; //kopiowanie wskaźników. rezerwacja wyżej traci sens wyciek pamięci
    delete[] array; // tablica array nie istnieje
    array = new T[ arr_size ]; //nowy wskaźnik na pamięć kolejny wyciek pamięci
    array = backup; // znowu wskaźnik array nadpisujesz i tracisz kolejną pamięć      
    capacity = arr_size;
}
P-158016
« 1 »
  Strona 1 z 1