Vector all'interno di un altro vector

di il
10 risposte

Vector all'interno di un altro vector

Salve,
dato un vector dove ogni elemento è composto da uno struct, a sua volta composto da una stringa (array di char) e da un altro vector.
struct parana
{
char parola[20];
vector<char> anagr;
};

vector<parana> vet; 
?

Lo scopo del mio programma, a scopo didattico, è di leggere in input N parole e dopo averle memorizzate nell'array di char, copia ogni singolo carattere nel vector interno allo struct.
Di seguito il codice del mio programma ed in basso il mio quesito:

struct parana
{
char parola[20];
vector<char> anagr;
};
?

Void inserisci(vector<parana> & arr)
{
   int N=0;
   unsigned int w;
   parana temp;

   cin >> N;
   for(int i=0; i<N; i++)
   {
      cin >> temp.parola;                                       // digito una parola
      arr.push_back(temp);
         for(w=0; w<strlen(arr[i].parola); w++)         //scansione lettere della parola
            (arr[i].anagr).push_back((arr[i].parola)[w]);
}


void scan(vector<parana> & arr)
{
   unsigned int i=0;
   unsigned int np=0;
   for (; np<arr.size(); np++)
      for (; i<strlen(arr[np].parola); i++)
         (arr[np].anagr).push_back((arr[np].parola)[i]);
}

int main()
{
   vector<parana> vet; 
   inserisci(vet);
   scan(vet);
}
?
Il problema è che non capisco come mai se la copia della stringa la eseguo nella funzione inserisci va tutto bene, mentre se la eseguo nella funzione scan viene copiata soltanto la prima stringa.
Per capire le differenze ho lasciato il codice di copia della stringa in entrambe le funzioni che comunque riporto per maggiore chiarezza:
   for(w=0; w<strlen(arr[i].parola); w++)         //scansione lettere della parola
            (arr[i].anagr).push_back((arr[i].parola)[w]);
?      for (; i<strlen(arr[np].parola); i++)
         (arr[np].anagr).push_back((arr[np].parola)[i]);
Da una prima analisi, che non ho riportato nel codice, ho notato che nella funzione inserisci vengono stampati gli indirizzi di memoria di tutti i vector interni anagr e quindi deduco che sono correttamente allocati all'interno dello struct per ogni elemento del vector più esterno.
Nella seconda funzione invece vedo soltanto stampato l'indirizzo di memoria del primo vector interno ma NON quelli dei successivi.
Quindi c'e' un problema di allocazione?! Dove sbaglio?
Vorrei capire come fare questa copia all'interno della funzione 'scan', cancellando ovviamente il codice analogo nell'altra funzione.

10 Risposte

  • Re: Vector all'interno di un altro vector

    Prima dui tutto, perché non usi le string del c++ al posto degli array di char? Se usi vector e c++ non ha senso usare le string.

    E poi sei sicuro di usare un vector di char? Di caratteri singoli?
  • Re: Vector all'interno di un altro vector

    zio_mangrovia ha scritto:



    Il problema è che non capisco come mai se la copia della stringa la eseguo nella funzione inserisci va tutto bene, mentre se la eseguo nella funzione scan viene copiata soltanto la prima stringa.
    Per capire le differenze ho lasciato il codice di copia della stringa in entrambe le funzioni che comunque riporto per maggiore chiarezza:
       for(w=0; w<strlen(arr[i].parola); w++)         //scansione lettere della parola
                (arr[i].anagr).push_back((arr[i].parola)[w]);
    
    ?      for (; i<strlen(arr[np].parola); i++)
             (arr[np].anagr).push_back((arr[np].parola)[i]);
    Da una prima analisi, che non ho riportato nel codice, ho notato che nella funzione inserisci vengono stampati gli indirizzi di memoria di tutti i vector interni anagr e quindi deduco che sono correttamente allocati all'interno dello struct per ogni elemento del vector più esterno.
    Nella seconda funzione invece vedo soltanto stampato l'indirizzo di memoria del primo vector interno ma NON quelli dei successivi.
    Quindi c'e' un problema di allocazione?! Dove sbaglio?
    Vorrei capire come fare questa copia all'interno della funzione 'scan', cancellando ovviamente il codice analogo nell'altra funzione.
    Perché manca "i = 0" nel secondo for, che è l'analogo di "w = 0". E grazie che ti copia solo la prima stringa: dalla seconda in poi esce sempre dal ciclo

    Ma non potete semplicemente debuggare passo passo invece di fare analisi?
  • Re: Vector all'interno di un altro vector

    Weierstrass ha scritto:


    Perché manca "i = 0" nel secondo for, che è l'analogo di "w = 0". E grazie che ti copia solo la prima stringa: dalla seconda in poi esce sempre dal ciclo
    Caspita!!! Hai ragione, pensavo addirittura di aver fatto una bella figura
    Più che altro mi interessava capire se il mio modo di procedere era corretto.
    Ma non potete semplicemente debuggare passo passo invece di fare analisi? 
    In realtà ho provato ma senz'altro non è stato sufficiente, ho usato ddd ma mi si piantava.
    Mi hanno consigliato anche valgrind, tu cosa mi consigli per il debug per la tua esperienza.

    Grazie ancora
  • Re: Vector all'interno di un altro vector

    oregon ha scritto:


    Prima dui tutto, perché non usi le string del c++ al posto degli array di char? Se usi vector e c++ non ha senso usare le string.
    Non conosco la classe string e non so quali vantaggi mi porterebbe, ma adesso ci do subito un occhio, apprezzo il suggerimento.
    E poi sei sicuro di usare un vector di char? Di caratteri singoli?
    Pensavo di usare un vector di <char> perchè nella fase successiva mi viene richiesto di ordinare tutte le lettere della parola secondo l'ordine lessicografico ad. es barba -> aabbr , quindi sfrutterei il sort STL per il mestiere. Sono ben accetti i consigli.
    Grazie
  • Re: Vector all'interno di un altro vector

    E anche quando perché il vector lo conservi nella struttura? E' il risultato ordinato che devi memorizzare.

    Gli array di char hanno una dimensione fissa e devi fare attenzione a non oltrepassarla; la gestione di aggiunte, rimozioni, ricerche è molto più complicata. La classe string elimina tutti questi problemi per gestire una stringa di caratteri. Se usi i vector non vedo perché tu non possa usare le string.
  • Re: Vector all'interno di un altro vector

    Guarda, io non sono così esperto: C++ lo uso solo sotto Windows e solamente in 2 casi:
    1) quando devo fare unit testing esteso e approfondito delle mie routine C embedded
    2) quelle rare volte che devo guardare cosa fa un driver a basso livello per fare una micro-modifica.

    Come IDE uso Visual Studio. Sotto Linux non saprei, voci dalla regia mi dicono che CLion sia ottimo.

    p.s.: se l'errore non fosse stato banale, comunque ti avrei abbandonato al tuo destino. Per me i template sono accettabili solo al primo livello di annidamento
  • Re: Vector all'interno di un altro vector

    Weierstrass ha scritto:


    p.s.: se l'errore non fosse stato banale, comunque ti avrei abbandonato al tuo destino.
  • Re: Vector all'interno di un altro vector

    oregon ha scritto:


    E anche quando perché il vector lo conservi nella struttura? E' il risultato ordinato che devi memorizzare.

    Gli array di char hanno una dimensione fissa e devi fare attenzione a non oltrepassarla; la gestione di aggiunte, rimozioni, ricerche è molto più complicata. La classe string elimina tutti questi problemi per gestire una stringa di caratteri. Se usi i vector non vedo perché tu non possa usare le string.
    In effetti vedo che la classe string dispone di molte funzioni membro utilissime per la manipolazione delle stringhe, ma se poi dovessi ordinare i caratteri all'interno della stessa come mi dovrei comportare ? Applico un qualsiasi algoritmo di ordinamento ai singoli elementi della stringa poiché non esiste un analogo del sort del vector stl, giusto?
  • Re: Vector all'interno di un altro vector

    La string è al posto del vettore di char !
  • Re: Vector all'interno di un altro vector

    Ah ok, quindi posso utilizzare tranquillamente la funzione membro sort( ..begin(), ...end(),..) . Nella documentazione non lo trovavo scritto.
Devi accedere o registrarti per scrivere nel forum
10 risposte