2012-11-01 69 views
5

Tôi bị kẹt trên một bài tập về nhà. Tôi phải đọc văn bản từ một tập tin, phân bổ mỗi từ vào bộ nhớ, sau đó người dùng một con trỏ để gửi nó đến một vector<string*>. Chương trình của tôi tiếp tục ghi đè vectơ với từ mới từ tệp thay vì chỉ thêm nó. Tôi không thể hiểu tại sao điều này lại xảy ra.C++ vector với con trỏ

#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

Geez .. Nhiệm vụ của bạn thực sự buộc bạn phải sử dụng một vector con trỏ và không giải thích tại sao đây là một ý tưởng khủng khiếp? Như bạn đã biết, bây giờ bạn có gánh nặng giải quyết mọi phần tử trong vectơ của bạn theo cách thủ công, phủ nhận một lợi ích to lớn mà vectơ mang lại cho bạn. * đôi khi * bạn cần lưu trữ con trỏ trong vectơ (không thường xuyên!) và trong trường hợp đó, bạn sẽ sử dụng con trỏ thông minh, tức là 'unique_ptr' hoặc một cái gì đó tương tự. Hãy chắc chắn nói với giáo viên của bạn lần sau khi bạn gặp anh ấy/cô ấy. –

Trả lời

3

Hoặc sử dụng một vector<string> hoặc phân bổ chuỗi mới trên heap:

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

Chắc chắn nó tốt hơn để vượt qua giá trị bởi const ref chứ không phải là con trỏ? sau đó không có dereferencing khó chịu vv ... – Caribou

+0

@Caribou Vâng, đúng vậy. Nhưng tôi muốn đi với những thay đổi tối thiểu. Nếu không, bạn cũng phải thay đổi trang web gọi điện. –

+0

true - chỉ là cringing đây;) – Caribou

1

Bạn đang đẩy mạnh các yếu tố tương tự vào vector đó là địa chỉ của từ. Tôi xoa bóp một chút về code của bạn

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

chuỗi word của bạn luôn luôn có cùng một địa chỉ trong bộ nhớ, vì vậy trong vòng lặp bạn đang thay đổi giá trị của chuỗi, nhưng sau đó bạn gọi WordFunctions đi với anh luôn cùng một địa chỉ .

Nếu đó là một hạn chế sử dụng vector<string*> thay vì vector<string>, bạn có thể sẽ cần phải phân bổ bộ nhớ cho chuỗi mới trong vòng lặp, sao chép có văn bản của bạn và sau đó vượt qua tham chiếu mới để WordFunctions

char *wordPtr 

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

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

    WordFunctions(wordPtr, a); 
} 
+1

Tôi không hoàn toàn chắc chắn nó hoạt động, nhưng ý tưởng nên được điều này. – unziberla

+1

Xin chào, anh chàng này đang cố gắng sử dụng C++. Tại sao bạn đề xuất sử dụng 'malloc'? – Ruu

+1

Bạn đã đúng! Nó rất giống với bài tập về nhà cổ điển tôi đã làm trong C mà tôi đã giải quyết nó theo cách đó! Nhìn thấy giải pháp chính xác và upvoted – unziberla