Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [C++] Vettori dinamici

  1. #1
    Utente di HTML.it L'avatar di sko
    Registrato dal
    Jun 2003
    Messaggi
    273

    [c++] vettori dinamici

    quando creo un oggetto della mia classe si crea un vettore di n elementi (n lo passo io come parametro)

    poi con le opportune funzioni posso inserire e cancellare elementi da questo vettore.

    ora dovrei modificare le funzioni in modo che se il vettore e per meta' vuoto dimezzarlo, se è pieno raddoppiarlo..

    allora nella funzioni mi è facile individuare quando applicare le suddette operazioni, ma ignoro completamente la modalita'

    come faccio a raddoppiare e a dimezzare le dimensioni di un vettore?

    grazie

  2. #2
    Utente di HTML.it L'avatar di NA01
    Registrato dal
    May 2004
    Messaggi
    113
    credo tu stia cercando la realloc.
    tieni conto chè è l'operazione meno veloce del mondo.

    poi se usi il c++ non vedo perchè usare i contenitori della libreria standard nel qual casi si usa resize

    ciao

  3. #3
    Utente di HTML.it L'avatar di sko
    Registrato dal
    Jun 2003
    Messaggi
    273
    allora io ho gia' una classe con un tot di funzioni che provvedono alla creazione, inserimento e cancellazione degli elementi in un array

    io devo solo apportare quella modifica

    in pratica dopo l'inserimento controllare se l'array e pieno o vuoto x meta' raddoppiare o dimezzarlo...

  4. #4
    Utente di HTML.it L'avatar di NA01
    Registrato dal
    May 2004
    Messaggi
    113
    bhè, se le specifiche sono così strette non ti resta che usare la realloc

    ciao!

  5. #5
    Utente di HTML.it L'avatar di sko
    Registrato dal
    Jun 2003
    Messaggi
    273
    Originariamente inviato da NA01
    bhè, se le specifiche sono così strette non ti resta che usare la realloc

    ciao!
    allora io ho un costruttore:

    template <class T>
    DizVetOrd<T>:izVetOrd(int n)
    {
    // setto la varabile privata num_elem a n
    num_elem=n;
    //creo un nuovo dizionario v di num elementi
    v = new T[num_elem];
    // setto free a 0 (prima posizione libera nll'array);
    free=0;
    }

    poi nella funzione inserisci...
    template <class T>
    void DizVetOrd<T>::Inserisci(T elem)
    {

    // se vettore è pieno raddoppio dinamicamente le dimensioni del vettore
    if(free >=num_elem)
    {
    // raddoppio le dimensioni

    }


    come dovrei scrivere per portare l'oggetto
    v a dimensiono v[num_elem*2] ??

  6. #6
    Utente di HTML.it L'avatar di NA01
    Registrato dal
    May 2004
    Messaggi
    113
    brutta storia, giustamente usi new per allocare. non so se realloc si arrabbia se lo lanci su qualcosa allocato con new. sarebbe da provare...
    comunque realloc se ben ricordo si usa così
    puntatore = realloc(puntatore, dimensione);
    con un bel cast esplicito sul tipo.
    il problemuccio è che devi provare se va con new. potrebbe, ma non ne ho idea

    ciao

  7. #7
    Utente di HTML.it L'avatar di sko
    Registrato dal
    Jun 2003
    Messaggi
    273
    io avevo pensato ad una soluzione piu' diciamo "grezza"

    creare con la new un nuovo elemento il doppio piu grande "travasare" i dati e in qualche modo legarlo a l'oggetto precedente eliminando lo spazio che occupava...

    ma non ho idea se si possa fare.. e quanto sia "corretto"

  8. #8
    Utente di HTML.it L'avatar di sko
    Registrato dal
    Jun 2003
    Messaggi
    273
    uhm facendo:

    num_elem=num_elem/2;
    v = (T *)realloc(v, num_elem);

    pare funzionare..

    mi interessa sapere se e' il modo giusto di procedere,in c++.

  9. #9
    Utente di HTML.it L'avatar di NA01
    Registrato dal
    May 2004
    Messaggi
    113
    Originariamente inviato da sko
    io avevo pensato ad una soluzione piu' diciamo "grezza"

    creare con la new un nuovo elemento il doppio piu grande "travasare" i dati e in qualche modo legarlo a l'oggetto precedente eliminando lo spazio che occupava...

    ma non ho idea se si possa fare.. e quanto sia "corretto"
    è quello che fa la realloc.
    non è nulla di che.
    dando come dim la dimensione vecchia il codice è:
    codice:
    dim *=2;
    vettoreNuovo = new TIPO[2]
    for(int i = 0; i < dim/2; i++){
       vettoreNuovo[i] = vettoreVecchio[i];
    }
    delete[] vettoreVecchio;
    vettoreVecchio = vettoreNuovo;
    ciao!

  10. #10
    Utente di HTML.it L'avatar di sko
    Registrato dal
    Jun 2003
    Messaggi
    273
    grazie mille

    sai per caso quale è piu' "corretta" come soluzione?
    didatticamente parlando..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.