fantastico! pensavo che l'unico modo per aggiungere elementi al vector fosse quello di aggiungere in coda e poi ordinare!
ora vedo di capirci..
potresti mica spiegarmi in maniera semplice come effettuare questo inserimento?
fantastico! pensavo che l'unico modo per aggiungere elementi al vector fosse quello di aggiungere in coda e poi ordinare!
ora vedo di capirci..
potresti mica spiegarmi in maniera semplice come effettuare questo inserimento?
Prova a guardare questo codice:
codice:#include <iostream> #include <vector> #include <string> const unsigned int num_letters = ('z' - 'a') + 1; typedef std::vector<std::string> dictionary [num_letters]; void print_dictionary(dictionary d) { for(unsigned int i=0; i<num_letters; ++i) { for(unsigned int j=0; j<d[i].size(); ++j) { std::cout << d[i][j] << std::endl; } } } void insert_in_dictionary(dictionary D, std::string word) { int letter = word[0]-'a'; if(D[letter].size() == 0) { D[letter].push_back(word); return; } for(std::vector<std::string>::iterator it = D[letter].begin(); it != D[letter].end(); ++it) { if((*it).compare(word) > 0) { D[letter].insert(it, word); return; } } } int main() { dictionary D; std::string word = "apple"; insert_in_dictionary(D, word); std::string another_word = "airplane"; insert_in_dictionary(D, another_word); std::string just_another_word = "another"; insert_in_dictionary(D, just_another_word); print_dictionary(D); return 0; }
Nota: l'ho scritto un po' al volo... Sembra funzionare, ma non è da escludere che ci sia qualche errore!
Infatti un errore c'era: non funzionava nel caso la parola da inserire dovesse andare in ultima posizione. Ora dovremmo esserci:
codice:void insert_in_dictionary(dictionary D, std::string word) { int letter = word[0]-'a'; if(D[letter].size() == 0) { D[letter].push_back(word); return; } for(std::vector<std::string>::iterator it = D[letter].begin(); it != D[letter].end(); ++it) { if((*it).compare(word) > 0) { D[letter].insert(it, word); return; } } D[letter].push_back(word); }
ho qualche difficoltà nel capire il for.. a parte il fatto che nel mio codice ho usato using namespace std; , non mi sono ben chiari i vari comandi
Praticamente dichiaro un oggetto iterator che "punta" al primo elemento del vettore (ottenuto con begin), poi lo incremento (++it) fino alla fine del vettore (ottenuta con end).
All'interno del for ottengo l'elemento a cui punta l'iteratore (cioè la stringa, corrispondente a una parola memorizzata nel dizionario) tramite una normale dereferenziazione, quindi *it. Su questa stringa posso poi chiamare il metodo compare per fare in modo di rispettare l'ordinamento desiderato.
Ok, ho capito. Il programma compila anche, però col comando -Wall mi da questi errori:
![]()
Eh certo... hai dichiarato la funzione come bool! Quindi devi ritornare un booleano in ogni caso, mentre tu ritorni un booleano in due casi su tre. Per risolvere dovresti mettere un return true (o false) anche dopo l'ultima riga.
In ogni caso non so se sia utile dichiarare la funzione come bool. Dopotutto quando è che ritorni false?![]()
ahhhh ho capito!
Caspita, sei stato illuminante. Grazie davvero :O Se ho ancora problemi ti ricontatto qui!
Ecco: c'è anche una funzione per la delete oltre che l'inserimento?
Oppure devo trovare la parola, spostare tutte le celle e fare un resize?
No no c'è anche la funzione erase. È da usare con un po' di cautela perchè invalida gli iteratori, ma per eliminare una sola parola non ci sono problemi.