PDA

Visualizza la versione completa : Aggiungere elementi ad array di vector in C++?


in4matic
22-12-2014, 17:24
Ciao a tutti. Sto implementando un dizionario.
Ho dichiarato il seguente array di vector:


typedef std::vector<std::string> dictionary [num_letters];

dove num_letters a sua volta stata dichiarata come:
const unsigned num_letters = ('z' - 'a') + 1;

Ho fatto un array di 26 celle quindi, cos dentro ad ogni cella c' una lettera e le parole che iniziano per quella lettera. La domanda questa: come faccio ad aggiungere un elemento alla cella? Perch so che posso trattare il vector come un array bidimensionale, e a prima vista farei:

D[W[0]-'a'].push_back(W);

Solo che cos non so se sto aggiungendo nel modo giusto, infatti comilando mi da segmentation fault.
Grazie in anticipo

minomic
22-12-2014, 17:33
Ciao, un primo problema che mi viene in mente questo: che succede se la prima lettera della tua parola maiuscola? A quel punto la sottrazione con 'a' d ovviamente un valore fuori range e ottieni un segfault.

in4matic
22-12-2014, 17:35
ho una fz che converte le parole maiuscole in minuscole.
il problema solo aggiungere le cose che non so come si faccia :)

minomic
22-12-2014, 17:42
Ho provato ma non riesco a replicare il tuo errore. Questo il codice che ho utilizzato:



#include <iostream>
#include <vector>
#include <string>


using namespace std;


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) {
cout << d[i][j] << endl;
}
}
}


int main()
{
dictionary D;

string word = "apple";
D[word[0]-'a'].push_back(word);

string another_word = "tree";
D[another_word[0]-'a'].push_back(another_word);

print_dictionary(D);

return 0;
}

in4matic
22-12-2014, 17:44
cosa centra la stampa? io per ora vorrei inserire elementi nelle celle dell'array di vector :)

minomic
22-12-2014, 17:48
cosa centra la stampa?Mi sembra evidente che l'ho utilizzata per vedere se tutto funzionava correttamente. E in effetti sembra proprio che sia tutto ok. Altrimenti come avrei dovuto fare per vedere se le parole erano state memorizzate correttamente?

in4matic
22-12-2014, 17:54
scusa non aveva caricato bene la pagina!
Mi hai risolto il problema: nella mia mente trattavo il vector come monodimensionale. Grazie :D

minomic
22-12-2014, 17:56
S il dizionario bidimensionale: con il primo indice accedi alla "lettera del dizionario", che per a sua volta un vettore. Quindi con il secondo indice accedi alla specifica parola.Ciao! :ciauz:

in4matic
22-12-2014, 19:25
domanda: se mi dovessi trovare ad ordinare, ogni volta che inserisco una parola, la cella del mio vector (o meglio, solo la cella della parola inserita), che algortmo di ordinamento sarebbe utile da usare?
Sono indeciso tra selecton e insertion sort.. Alla fine la mia lista di nomi semre in ordine, devo semplicemente ordinare l'ultimo inserito ogni volta dopo il push_back

minomic
22-12-2014, 20:28
Se ho ben capito quello che intendi, tu vuoi ordinare il vector che contiene tutte le parole che iniziano con una data lettera. Allora potresti evitare del tutto la push_back ed inserire direttamente la parola nella posizione corretta. Quindi scorri il vector (tramite un iteratore) e sfrutti il metodo insert (http://www.cplusplus.com/reference/vector/vector/insert/).

Loading