Skocz do zawartości

[C++] Struktury danych i ich przechowaywanie


Dawka83

Rekomendowane odpowiedzi

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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;

Odnośnik do komentarza
Udostępnij na innych stronach

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;
    }

Odnośnik do komentarza
Udostępnij na innych stronach

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;
    }

Odnośnik do komentarza
Udostępnij na innych stronach

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 )

Odnośnik do komentarza
Udostępnij na innych stronach

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).

Odnośnik do komentarza
Udostępnij na innych stronach

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;
    }

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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ę...