2012-11-01 18 views
5

Sono bloccato su un compito a casa. Devo leggere il testo da un file, assegnare ogni parola alla memoria, quindi utilizzare un puntatore per inviarlo a vector<string*>. Il mio programma continua a sovrascrivere il vettore con la nuova parola dal file invece di aggiungerlo. Non riesco a capire perché questo sta accadendo.Vettore C++ con puntatore

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 
using namespace std; 


void WordFunctions(string *pstr, vector<string*> &words) 
{ 
    words.push_back(pstr); 
} 
int main(){ 
    ifstream file; 
    vector<string*> a; 
    string word; 
    int w =0; 
    file.open("word.txt"); 
    while (!file.eof()) 
    { 
     w++; 
     file >> word; 

     WordFunctions(&word, a); 
    } 
    file.close(); 

    for (int i=0;i<10;i++){ 
     cout<<(*a[i])<<" "; 
     delete a[i]; 
    } 

    system ("pause"); 
} 
+1

Accidenti .. il tuo compito ti costringe a usare un vettore di puntatori e non spiega perché questa sia un'idea orribile? Solo così sai, ora hai l'onere di dislocare manualmente ogni elemento del tuo vettore, annullando un enorme vantaggio che il vettore ti offre. * a volte * è necessario memorizzare puntatori nel vettore (non spesso!) e in tal caso si utilizzerà un puntatore intelligente, ad esempio 'unique_ptr' o qualcosa di simile. Assicurati di dirlo al tuo insegnante la prossima volta che lo vedi. –

risposta

3

utilizzare un vector<string> o allocare la nuova stringa sul mucchio:

void WordFunctions(string *pstr, vector<string*> &words) 
{ 
    words.push_back(new string(*pstr)); 
} 
+0

Sicuramente è meglio passare il valore mediante const ref anziché pointer? quindi nessun brutto dereferenziamento ecc ... – Caribou

+0

@Caribou Sì, lo è. Ma volevo andare con cambiamenti minimi. In caso contrario, è necessario modificare anche il sito di chiamata. –

+0

true - stavo solo facendo i capricci;) – Caribou

1

Hai spingendo lo stesso elemento in vettore che è l'indirizzo della parola. Mi massaggio un po 'sul vostro codice

// pass reference to eliminate copy 
void WordFunctions(string &str, vector<string> &words) 
{ 
    words.push_back(str); 
} 
int main(){ 
    ifstream file; 
    vector<string> a; // you want to store string not the address of the string 
    string word; 
    int w =0; 
    file.open("words.txt"); 
    while (!file.eof()) 
    { 
     w++; 
     word.clear(); // clear the content before store something into it 
     file >> word; 
     WordFunctions(word, a); 
    } 
    file.close(); 

    for (size_t i=0;i<a.size();i++){ // use size instead of hard code magic number 
     cout<<(a.at(i))<<" "; // use at function instead of [] 
    } 

    system ("pause"); 
} 
-1

la stringa word ha sempre lo stesso indirizzo di memoria, quindi nel ciclo si sta modificando il valore della stringa, ma poi si chiama WordFunctions passando a lui sempre lo stesso indirizzo .

Se si tratta di un vincolo di utilizzare vector<string*> invece di vector<string>, è probabile che sia necessario allocare memoria per le nuove stringhe in loop, c'è copiare la tua parola e quindi passare il nuovo riferimento per WordFunctions

char *wordPtr 

while (!file.eof()) 
{ 
    w++; 
    file >> word; 

    wordPtr = (char *)malloc((strlen(word)+1)*sizeof(char)); 
    strcpy(wordPtr, *word); 

    WordFunctions(wordPtr, a); 
} 
+1

Non sono del tutto sicuro che funzioni, ma l'idea dovrebbe essere questa. – unziberla

+1

Ehi, questo ragazzo sta cercando di usare il C++. Perché proponi di usare 'malloc'? – Ruu

+1

Hai ragione! Era così simile ai classici homework che ho fatto in C che ho risolto in questo modo! Visto ora la soluzione corretta e upvoted – unziberla