2012-11-01 13 views
5

私は宿題に固執しています。私はファイルからテキストを読んで、各単語をメモリに割り当ててから、ポインタをvector<string*>に送るためのポインタを割り当てなければなりません。私のプログラムは、ファイルを単に追加するのではなく、新しい単語でベクトルを上書きし続けます。なぜこれが起こっているのか分かりません。ポインタ付きC++ベクタ

#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

もぉに新しい参照を渡す、ループ内で新しい文字列にメモリを割り当てる必要があります。..あなたの割り当ては、実際にポインタのベクトルを使用するように強制し、なぜこれが恐ろしいアイデアであるのか説明しません。あなたが知っているように、今はベクトルのすべての要素を手動で割り当て解除する負担があり、ベクトルがあなたに与える大きな利点を否定します。 *時にはポインタをベクターに格納する必要があります(しばしば!)、その場合はスマートポインタ、つまり 'unique_ptr'かそれに類するものを使用します。あなたが彼/彼女を見る次回に先生に必ず伝えるようにしてください。 –

答えて

3

vector<string>を使用するか、ヒープ上に新しい文字列を割り当てる次のいずれか

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

確かに、ポインタではなく、const refで値を渡す方が良いでしょうか?厄介な逆参照などはありません。 – Caribou

+0

@Caribouはい、そうです。しかし、私は最小限の変更で行きたいと思っていました。それ以外の場合は、呼び出し元サイトも変更する必要があります。 –

+0

true - ここでうんざりしていた;) – Caribou

1

をあなたはワードのアドレスであるベクターに同じ要素を推進しています。私はあなたのコードにビットをマッサージ

// 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

ループ内では、文字列の値を変更しているが、その後、あなたはいつも彼に同じアドレスを渡すWordFunctionsを呼び出すように、あなたのword文字列は、常にメモリ内の同じアドレスを持っています。それは代わりにvector<string>vector<string*>を使用するための制約があります場合は

は、あなたはおそらく、あなたの言葉をそこにコピーしてWordFunctions

char *wordPtr 

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

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

    WordFunctions(wordPtr, a); 
} 
+1

私は完全には動作していないが、アイデアはこれでなければならない。 – unziberla

+1

ねえ、この男は、C + +を使用しようとしています。なぜあなたは 'malloc'を使うことを提案しますか? – Ruu

+1

あなたは正しいです!それは私がCでやった古典的な宿題にとても似ていて、私はそれをそのように解決しました!正しい解決策を見出し、上向きにした – unziberla

関連する問題