[c++] STL

di il
10 risposte

[c++] STL

Scrivere un programma che produca un indice per un libro. Il file di input sia costituito da numeri di pagina
ed una informazione sull'indice del tipo:
<page-number>
<index-entry>

Ci può essere più di un recordo per ogni singola voce di indice. L'output dovrebbe essere una lista di
citazioni ordinate del tipo
alpha 10, 20, 30
beta 1, 2, 3, 4
gamma 5, 6, 18


ho bisogno di qlk dritta per lo sviluppo.
aspetto vostri consigli.

Saluti.

10 Risposte

  • Re: [c++] STL

    Esempio pratico di input e output? Dal testo non si capisce un gran che.
    std::map<std::vector<int>> può essere una soluzione.
  • Re: [c++] STL

    Sul fatto che dalla traccia nn si capisca molto confermo.
    Io l'ho interpretato cosi:

    senza cosiderare la carica de file, dichiaro un container multimap e come chiave metto una stringa che considero l' indice, come valore invece metto un intero che considero come il numero di pagina.

    GRAFICAMENTE INTENDO UNA COSA DEL GENERE:
    parola indice num.pag
    casa 1
    porta 2
    città 3
    casa 4
    finestra 5
    casa 6

    l'output dovrà essere una cosa del genere

    casa 1,4,6
    citta 3
    finestra 5
    porta 2
    il problema sta che se sono presenti stesse parole in pagine diverse devo visualizzare quella parola una sola volta a differenza delle relative pagine che devono sempre essere stampate.

    se uso un map mi viene eliminato anke il campo valore e non è questo che vogliano ottenere.

    cosa mi proponi???
  • Re: [c++] STL

    
    std::map<std::string,std::vector<int>> mappaIndicepagina;
    
    std::map<std::string,std::vector<int>>::iterator it = mappaIndicePagina.find(parola);
    if(it != mappaIndicePagina.end())
            it->second.push_back(paginaCorrente);
    else
    {
        std::vector<int> numpagina;
        numPagina.push_back(paginaCorrente);
        mappaIndicePagina[parola] =  numPagina;
    }
    
    Può funzionare no?
  • Re: [c++] STL

    Se puoi mi fai una bella descrizione scritta ???
    sono pochi giorni che ho iniziato lo studio della STL quindi non ho ancora dimestichezza con tali argomenti.
    vediamo un po:

    std::map<std::string,std::vector<int>> mappaIndicepagina;[\b]
    qui hai creto un cointainer MAP dove la chiave è string (indice di pag) , il valore è un vector???
    ho capito bene?? mi spieghi xk opti x questa idea?

    mi spieghi poi quell' if - else cosa controlla??
    fammi una bella panoramica un po sul tuo listato non dirmi niente

    ti ringrazio infinitamente skynet dammi un aiuto se puoi
  • Re: [c++] STL

    Ho creato una mappa di valori univoci per le stinghe (parole del libro) e un vettore di pagine dove compare sta parola. la funzione find ti trova se la parola è nella mappa e ritorna un iterator sulla posizione trovata oppure mappa.end() se non lo trova. it->first è la chiave (stringa) e it->second è il vettore di pagine. Hai due casi: se lo trova significa che la parola l'ho già inserito prima e quindi basta aggiungere la pagina nel vettore delle pagine. Se non lo trova allora devi creare un vettore di int vuoto e inserire la pagina. Dopo di che inserisci la coppia (std::pair) di (parola,vettoredipagine) nella mappa. Una cosa non ho capito: se la parola compare + volte nella stessa pagina questo metodo non funzionerebbe in quanto i valori nel vettore sarebbero non univoci. A quel punto invece di usare il vettore di int si usa il std::set<int> che è come una mappa ma solo con la chiave (in questo caso univoca).
  • Re: [c++] STL

    #include <vector>
    #include <map>
    #include <iterator>
    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    typedef map <string , vector<int> >  mmid;
    
    int main(){
    mmid pairs;
    
    pairs.insert(mmid::value_type("casa",9));  //errore
    pairs.insert(mmid::value_type("città",5));  //errore
    
    mmid::iterator it = pairs.find("casa");
    if(it != pairs.end())
         it->second.push_back(9);
    else
    {
        vector<int> numPagina;
        numPagina.push_back(9);
        pairs["casa"] =  numPagina;
    }
     }
    skynet ho provato ad abbozzare un qualcosa. ti indicato gli errori o meglio l' errore perchè è identico ad entrambe le linee di codice.
    magari prova te a compilarlo e se puoi mi fai sapere.
    spiegami cm hai fatto prima dv sei stato molto preciso e chiaro se ho fatto qlk altro errore nel codice da me scritto.

    ancora grazie.
  • Re: [c++] STL

    
    pairs.insert(mmid::value_type("casa",9));
    
    a parte che il 9 non è un vettore ma un numero il codice corretto sarebbe stato:
    
    vector<int> vet;
    vet.push_back(9);
    pairs.insert(mmid::value_type("casa",vet));
    
    ma non funziona coi typedef. le soluzioni sono due:
    1.
    
    vet.push_back(9);
    pairs.insert(map <string , vector<int> >::value_type("casa",vet));
    
    2.
    
    vet.push_back(9);
    pairs.insert(make_pair("casa",vet));
    //per make_pair devi includere <utility>
    
    a te la scelta.
  • Re: [c++] STL

    Come non detto. coi typedef funziona, errore mio. Devi solo creare il vettore e inserirlo. Restano cmq validi anche gli altri modi di inserimento. Questo invece non è valido (per quello che mi confondevo)
    
    pairs.insert(pairs::value_type("casa",vet));
    
  • Re: [c++] STL

    Skynet sto procedendo un po sulle indecazione che mi hai dato tu e penso che per avere qualcosa di piu concreto dovremo aspettare domani. intanto volevo farti leggere il listato sempre di questo programma che avevo scritto io prima che aprivo il topic sul forum
    #include <iostream>
    #include <map>
    #include <string>
    
    using namespace std;
    
    typedef multimap <string , int ,less <string> > mmid;
    
    int main(int argc, char **argv) {
    
    mmid pairs;
    pairs.insert(mmid::value_type("casa",5));
    pairs.insert(mmid::value_type("casa",6));
    pairs.insert(mmid::value_type("casa",7));
    pairs.insert(mmid::value_type("finestra",8));
    pairs.insert(mmid::value_type("sedia",9));
    pairs.insert(mmid::value_type("armadio",10));
    pairs.insert(mmid::value_type("tappeto",14));
    mmid::const_iterator iterSucc=pairs.begin();
    mmid::const_iterator iter=pairs.begin();
    
    for(int i=0;i<pairs.size();i++,++iter)//,++iter1)
    {
    	iter->first!=(++iterSucc)->first ? cout<<iter->second<<"\t<<iter->first<<\n":cout<<iter->second<<" " ;   //if steatement
    	if(iterSucc==pairs.end())
    	  cout<<iter->first<<"\t"<<iter->second;
    }
    return 0;
    }
    creao un iteratore multimap dopo di che nell' ultimo ciclo for controllo la chiave del primo elemento con quella successiva. stampa tutto come vorrei . il problema nasce quando deve controllare l'ultimo elemento con l'elemento successivo all ' ultimo. La stampa nn viene effettuata e facendo il debug mi va in abort() inaspettatamente propio quando incrementa iterSucc di uno. cosa ne pensi te???
  • Re: [c++] STL

    Che non devi utilizzare il for se esistono delle funzioni proprie. la funzione equal_range in multimap ti ritorna un pair rispettivamente della prima e dell' ultima posizione dove ha trovato la chiave, quindi non c'è bisogno di una funzione propria. puoi sermpre cmq usare it++ e poi caso speciale se it = end allora it = begin ma è troppo laborioso. a domani.
Devi accedere o registrarti per scrivere nel forum
10 risposte