Skocz do zawartości

[C++] Struktury danych i ich przechowaywanie


Rekomendowane odpowiedzi

Opublikowano

Siemka! Potrzebuje jakieś struktury danych do której bd się mógł odwołać poprzez str[5].zmienna. Coś jak wektory tyle, że po usunięciu danego wiersza, pozostałe nie bd wskakiwały na jego miejsce lecz pole zostanie wolne i bd oczekiwało aż ponownie jego miejsce zostanie zajęte.

Opublikowano

Powinno działać

template< class Type >
class structure
{
private:
    Type *zmienna;
    size_t size;
public:
    structure()
    {
        zmienna = new Type[0];
        size = 0;
    }

    ~structure()
    {
        delete [] zmienna;
    }

    void Add(Type var)
    {
        size++;
        Type *temp = new Type[size];
        for( int i = 0; i < size-1; i++ )
        {
            temp[i] = zmienna[i];
        }
        temp[size-1] = var;
        delete [] zmienna;
        zmienna = temp;
    }

    void Delete(size_t el)
    {
        zmienna[el] = NULL;
    }

    size_t Size()
    {
        return size;
    }

    Type & operator [] (size_t el)
    {
        return zmienna[el];
    }

};

Użycie:

structure<int> lol;
lol.Add(4);
lol.Add(2);
lol.Add(6);
lol.Delete(0);
lol[1] = 5;
cout << lol[0] << endl;
cout << lol[1] << endl;
cout << lol[2] << endl;

Opublikowano

A czy jeżeli wywołam coś takiego

lol.Add(100);
lol.Delete(0);
lol.Add(500);

To na miejsce 100 wskoczy 500?

 

Dobra już sobie przerobiłem, prawdopodobnie powinno działać :D :

    int add(Type var)
    {
        Type *temp = new Type[size];
        bool _add = false;
        int id;
        for( int i = 0; i < size; i++ )
        {
            temp[i] = zmienna[i];
            if (temp[i] == NULL)
            {
                temp[i] = var;
                _add = true;
                id = i;
            }
        }
        if (_add == false)
        {
            temp[size] = var;
            id = size;
            size++;
        }
        delete [] zmienna;
        zmienna = temp;
        return id;
    }

Opublikowano

Tamto chyba nie będzie działać, a jeśli tak to nie potrzebnie alokujesz miejsce, moje wersja:

    int add(Type var)
    {
        bool _add = false;
        int id;
        for( int i = 0; i < size; i++ )
        {
            if( zmienna[i] == NULL )
            {
                zmienna[i] = var;
                id = i;
                _add = false;
                break;
            }
        }
        
        size += _add;
        Type *temp = new Type[size];
        
        for( int i = 0; i < size-_add; i++ )
            temp[i] = zmienna[i];
        
        if( _add )
        {
            temp[size - 1] = var;
            id = size;
        }

        delete [] zmienna;
        zmienna = temp;
        return id;
    }

Opublikowano

Hmm jeszcze mam taki problem ze gdy zdeklaruje sb tą strukturę z moją klasą Player to nie działa ;/ Dokładnie:

struct.h(25): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Player' (or there is no acceptable conversion)

 

Ta linijka:

if( zmienna[i] == NULL )

Opublikowano

Bo w tych szpiczastych nawiasach( zapomniałem nazwy xD) dajesz typ zmiennej, czyli:

structure<player> nazwa;

 

EDIT: Dodaj do klasy player przeciążenie operatora '==' zwracającom this, albo bool true, teraz nie pamiętam.

Opublikowano

Teraz niby wszystko ok sie kompiluje jednak przy wywołaniu

players.Add(Player());

program się wywala... ;/ Kompilator wywala zupełnie nic nie znaczące errory:

First-chance exception at 0x002f6fe4 in program.exe: 0xC0000005: Access violation reading location 0x583a9a04.
Unhandled exception at 0x002f6fe4 in program.exe: 0xC0000005: Access violation reading location 0x583a9a04.
The program '[2528] program.exe: Native' has exited with code -1073741819 (0xc0000005).

Opublikowano

Teraz powinno działać( u mnie działa ):

    int Add(Type var)
    {
        bool _add = true;
        int id;
        for( int i = 0; i < size; i++ )
        {
            if( zmienna[i] == NULL )
            {
                cout << i <<endl;
                zmienna[i] = var;
                id = i;
                _add = false;
                break;
            }
        }
        
        size += _add;
        Type *temp = new Type[size];
        
        for( int i = 0; i < size-_add; i++ )
            temp[i] = zmienna[i];
        
        if( _add )
        {
            temp[size - 1] = var;
            id = size;
        }

        delete [] zmienna;
        zmienna = temp;
        return id;
    }

Opublikowano

Przyjrzałem się nieco bliżej temu rozwiązaniu i nie ma ono zbytniego sensu.

Popatrz przykładowo na to:

void Delete(size_t el)
    {
        zmienna[el] = NULL;
    }

Dane pole nie jest usuwane, "wycinane", a jedynie zerowane. Co, jeśli użytkownik struktury chciałby mieć element o wartości zero? Wtedy metoda Add(type var) rozumiałaby to tak, że to pole nie istnieje(== NULL). Oprócz tego "zmienna[el] = NULL" nie powinno się skompilować w przypadku klasy takiej jak Player.

Ja użyłbym tablicy wskaźników:

private:
    Type** zmienna;

Dzięki temu będziemy w stanie odróżnić "stan" pola(istnieje bądź nie) od jego wartości.

Opublikowano

Wszystkie fragmenty kodu w tym temacie są całkowicie bez sensu. Błąd jest spowodowany mazianiem po pamięci. Usunąć wszystko i jeszcze raz przemyśleć. Najważniejsza sprawa to nie tworzyć od nowa tablicy przy każdym dodaniu nowego elementu+ odróżnić stertę od stosu a najlepiej użyć wektora do czasu poprawienia swoich umiejętności na tyle aby rozumieć pisany przez siebie kod.

Opublikowano
Najważniejsza sprawa to nie tworzyć od nowa tablicy przy każdym dodaniu nowego elementu

Dodam, że chcąc się do tego ustosunkować, możnaby zaczerpnąć rozwiązanie z stla - w wektorze pamięć alokowana jest "co jakiś czas", tzn. robiony jest zapas w momencie, gdy zabraknie miejsca.

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...