2011-05-09 45 views
3

我有一個文件,它的第一行是英文字母,隨機順序,之後,名稱。我應該根據給定的字母來排列名字。我的類看起來是這樣的:設置自定義函數對象比較器c + +

class MyCompare(){ 
    private: 
    static map<char, int> order; 
    public: 
    MyCompare(string alphabet){ 
     //loop through the string, assign character to it's index in the map 
     // order[ alphabet[i] ] = i; 
    } 
    bool operator()(const string s1, const string s2) { 
     //compare every character using compchar, return the result 
    } 
    bool compchar(const char c1, const char c2){ 
     return order[c1]<order[c2]; 
    }   

}

主,我做了這樣的事情:

int i=0; 

if (myfile.is_open()) { 
    while (myfile.good()) { 
     i++; 
     getline (myfile,line); 
     if(i ==1){ 
      MyCompare st(line); 
      set<string, MyCompare> words(st);     
     } 
     words.insert(line);    
    } 
    myfile.close(); 
} 
當然

,這是不行的,因爲設置ISN」在if塊之外可見。我不能拿出任何東西,但... 請指教。

+0

我不知道看這個代碼應該做什麼。 – 2011-05-09 18:05:15

+0

「操作員」之後應該有一個操作員... – 2011-05-09 18:05:36

+0

@Mike DeSimone對不起,錯字。 – adamors 2011-05-09 18:06:39

回答

5

閱讀第一行,然後創建你的設置,然後進入循環。

if (myfile.is_open()) { 
    getline (myfile,line); 
    MyCompare st(line); 
    set<string, MyCompare> words(st); 
    while (getline(myfile,line)) { 
     words.insert(line); 
    } 
    myfile.close(); 

    // use words here 
} 
+0

我會建議對這段代碼做一個小的修改,以便利用@Mike DeSimone添加到問題中的註釋 - 檢查if(!myfile.is_open){//處理錯誤情況},然後檢查其餘部分代碼不需要嵌套。 – pstrjds 2011-05-09 20:11:07

0

可能不是您的問題的答案,但在控制循環時幾乎不應該測試流狀態位。你想:

if (myfile.is_open()) { 
    while (getline (myfile,line)) { 
     i++; 
     if(i ==1){ 
      MyCompare st(line); 
      set<string, MyCompare> words(st);     
     } 
     words.insert(line);    
    } 
    myfile.close(); 
} 
+0

摘下了http://www.cplusplus.com/doc/tutorial/files/ lol – adamors 2011-05-09 18:07:48

+0

@Ors這解釋了很多。在地球上你沒有辦法從網絡資源中學習C++。 – 2011-05-09 18:08:36

+0

就像[學習HTML,CSS等最糟糕的方式是去w3schools.com](http://w3fools.com/)一樣,儘管它們在Google上排名很高。 – 2011-05-09 18:22:54