Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Zmiana wielkości dynamicznej tablicy w C++

ElKuba 05 May 2005 23:14 5629 8
  • #1
    ElKuba
    Level 11  
    Witam :)

    Piszę aktualnie pewien mały projekcik w Dev-Cpp, i mam taki problem:

    W pewnym pliku mam zapisaną listę osób (nazwisko i imię) i wiem ile ich jest (np.10), a w programie mam klasę do opisu osob:

    Code:
    class OSOBA
    
    {
       ...
       char _nazwisko[15];
       char _imie[15];
       ...
    }


    Za pomocą new tworzę tablicę:

    Code:
    OSOBA *tab;
    
    tab = new OSOBA[10];


    i zapisuję do niej dane z pliku.
    No i teraz pojawia się problem, a mianowicie program posiada opcję dodawania kolejnych osób oraz ich usuwania, no i nie wiem jak zmienić wielkość tej tablicy. W C było to realloc ale to nie działa chyba na tablicę utworzoną przez "new".

    Proszę o pomoc !!!
  • Helpful post
    #2
    elektryk
    Level 42  
    Zrób liste obiektów "osoba" opartą na wskaźnikach. Albo "bardziej profejsonalnie" byłoby zrobić obiekt "zarządca_listy", który przechowuje wskaźnik do pierwszego elementu i ma metody typu "dodaj" i "usuń".
  • #3
    ElKuba
    Level 11  
    hmmm... w sumie to nawet wydaje mi się że to zrozumiałem :)
    Czyli w pierwszym przypadku to muszę zrobić po prostu listę jednokierunkową (o ile się nie mylę, bo jestem raczej początkujący i jeszcze nigdy czegoś takiego nie robiłem), natomiast drugi przypadek jest już trochę mniej zrozumiały: ja to zrozumiałem tak, że oprócz listy takiej jak w przypadku pierwszym muszę jeszcze zrobić jeden obiekt, który będzie sterował tą listą.
    No ale niestety nie jestem do końca pewien jak to zrobić, i czy mógłbym prosić o jakieś małe przykłady, w sumie - aż wstyd się przyznać - to jest mój pierwszy program w którym stosuję klasy :oops:

    Dodano po 1 [minuty]:

    Aha...i jeszcze jedno: czyli wynika z tego że w C++ nie ma odpowiednika funkcji malloc ?
  • #4
    Bielsky
    Level 21  
    We "współczesnym" c++ (masz takie w devc++) biblioteka standardowa oferuje tzw. kontenery, niektóe z nich potrafią się zachowywać jak tablica dynamiczna.
    W twoim przypadku możesz skorzystać np. z kontenera typu vector, krótki opis znajdziesz tutaj:
    https://bielsky.elektroda.pl/vector.html

    Quote:

    Aha...i jeszcze jedno: czyli wynika z tego że w C++ nie ma odpowiednika funkcji malloc ?


    Jest malloc, ale najczęściej nie ma potrzeby się nim posługiwać. Wygodniejsze jest new/delete
  • #5
    ElKuba
    Level 11  
    Już myślałem nad tym żeby zastosować vector, no ale nie wiem jak sprawdzić ile elementów mam w nim zapisanych, i jak wykasować ostatni element tego wektora, tak żeby zmniejszył się jego rozmiar. No bo "push_back" za każdym razem zwiększa jego rozmiar, a ja po wykasowaniu jakiegoś elementu chciałbym zmniejszyć rozmiar wektora aby nie zajmował niepotrzebnie pamięci.
  • Helpful post
    #6
    Bielsky
    Level 21  
    Code:

    #include <stdlib.h>
    #include <iostream>
    #include <vector>
    using namespace std;

    int main(int argc, char *argv[])
    {
        vector<int> wek;
        wek.push_back(1);
        wek.push_back(2);
        wek.push_back(3);
        wek.push_back(4);
        cout << "elementów w kontenerze: " << wek.size() << endl;
       vector<int>::iterator i;
       cout << "wypisujemy elementy kontenera\n";
       for(i=wek.begin();i!=wek.end();i++)
       {
          cout << *i << endl;
       }
       
       cout << "wypisujemy elementy kontenera po usunięciu jednego z elementów\n";
       wek.erase(wek.begin()+1); //usuwamy drugi element kontenera
       for(i=wek.begin();i!=wek.end();i++)
       {
          cout << *i << endl;
       }
       system("PAUSE");
        return 0;
    }

    Kontener typu vector jest dobry, gdy wystarczy nam dokładanie i usuwnie elementów z końca. Zapewnia za to szybki dostęp do poszczególnych elementów. dokładanie i usuwnie elementów ze środka jest możliwe, ale jest realizowane wolno.
    Jeżeli zależy nam na szybkości wstawiania i usuwania elementów do środka - lepiej jest użyć typ list. (gorzej jest w nim jednak z dostępem do poszczególnych elementów).
  • #7
    ElKuba
    Level 11  
    Dzięki :) Właśnie o coś takiego mi chodziło.

    Bielsky wiesz może gdzie znaleźć opis innych funkcji vektor-a ?
    Bo może się to kiedys przydać. W sumie już kiedyś tego szukalem no ale mi się nie udało :(

    A tak na przyszłość to może mi ktoś jeszcze dokładniej wyjaśnić to co elektryk mi poradził:
    elektryk wrote:
    Zrób liste obiektów "osoba" opartą na wskaźnikach. Albo "bardziej profejsonalnie" byłoby zrobić obiekt "zarządca_listy", który przechowuje wskaźnik do pierwszego elementu i ma metody typu "dodaj" i "usuń".
  • #9
    ElKuba
    Level 11  
    Wielkie dzięki wszystkim :D
    Zastosowałem vektor i wszystko bardzo prosto udało się zrobić.

    Pozdrawiam