Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]riordinamento vector

    Ciao.
    Ho un vector con degli elementi di classe CElement, ogni elemento puo' essere tolto o inserito , ma in ogni momento deve essere possibile riordinare il vector.
    In seguito ad una rimozione , devo spostare tutti gli elementi verso l'alto , e in seguito ad un inserimento alla posizione x devo spostare tutti gli elementi dalla fine alla posizione in posizione inserimento+1.
    E' possibile utilizzare i function objects?
    Esiste un algoritmo che risolve elegantemente?
    Grazie .

  2. #2
    Utente di HTML.it L'avatar di Mad_al
    Registrato dal
    Jun 2009
    Messaggi
    125
    se ho ben capito il problema, hai bisogno di ordinamento di vettori nell'inserimento e nell'eliminazione, giusto?
    per quanto riguarda gli algoritimi ce ne sono vari.
    posso dirti questi:
    per l'eliminazione di un elemento nel vettore e mantenere l'ordine:
    (utilizzi una funzione al quale passi per riferimento il vettore e la posizione dell'elemento da eliminare)

    void erase(vector<CElement> & v, int pos)
    {
    for (int i=pos; i<v.size() -1 ; i++)
    v[i] = v[i+1];
    v.pop_back();
    }

    per quanto riguarda l'inserimento di un elemento, usi la stessa funzione così:
    passi per riferimento il vettore, la posizione dove vuoi immettere l'elemento e, in aggiunta, l'elemento da inserire dello stesso tipo CElement:

    void insert(vector<CElement> &v; int pos; CElement a)
    {
    int last= v.size() - 1;
    v.push_back(v[last]);
    for (int i=last; i > pos; i--)
    v[i] = v[i-1];
    v[pos]=a;
    }

    dovrebbe essere abbastanza chiaro il funzionamento... se per caso non ho colto il tuo problema, fammelo sapere.. ciao!

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il problema non è il function object o l'algoritmo, quanto la frequenza di inserimento o eliminazione dei vari elementi in mezzo alla sequenza. Se è molto elevata può essere il caso di cambiare container o al limite (se devi usare il vector) travasare il tutto in una std::list, fare inserimenti o eliminazioni varie, invocare il metodo sort() della std::list o il std::sort generico e ritravasare tutto nel vector, dopo averlo ridimensionato alla size() della std::list.

    Se la frequenza degli inserimenti in mezzo alla sequenza è poco elevata potresti procedere come già indicato.
    Io incaspulerei le varie soluzioni in delle funzioni e proverei quale sia quella che offre prestazioni migliori in termini di tempo a parità di inserimento.

    Nel "thinking ... vol2" alla voce:

    The basic sequences:
    vector, list, deque

    puoi leggere pro e contro dei vari container.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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.