2011-02-27 57 views
1

我正在爲學校的CIS算法分析類編寫一個程序,我在理解實現方面遇到了一些麻煩,至於如何將從輸入文件中解析出的數據插入到映射其中的值是Entry類型的向量,它是一個包含頁碼和範圍的結構。我一直在閱讀幾個小時,我似乎無法得到正確的語法。將值插入到矢量地圖<entry>

前3行中的輸入文件的如下:

IX:{系列|(} {2} IX:{!系列幾何|(} {4} IX:{歐拉常數} {4}

基本上我解析一本書的索引,當我打印出圖應列出標題和頁面範圍的所有標題/子標題。

#include <fstream> 
#include <iostream> 
#include <vector> 
#include <string> 
#include <map> 

using namespace std; 

#define START 0 
#define END -1 

struct Cmp_Insen 
{ 
bool operator()(const string &lhs, const string &rhs) const 
    { 
    return stricmp(lhs.c_str(), rhs.c_str()) < 0; 
    } 
}; 

struct Entry 
{ 
int pageNum; 
int type; 
}; 

int main(int argc, char *argv[]) 
{ 
string inputstring, ent_nam_substring, pag_num_substring, page_number; 
int ent_nam_str, ent_nam_end, pag_num_str, pag_num_end; 
vector<Entry> page_range; 

if(argc < 2) 
    return 0; 
else 
{ 
    ifstream the_file (argv[1]); 
    if(!the_file) 
     cerr<<"Could not open file!\n"; 
    else 
    { 

    map<string,vector<Entry>,Cmp_Insen> mIndex; 
    //map<string,vector<Entry>,Cmp_Insen>::const_iterator iter; 
    //for(iter = mIndex.begin(); iter != mIndex.end(); ++iter) 


    while(!the_file.eof()) 
    { 
     getline(the_file, inputstring);  // Extract Entry Heading Start 
     ent_nam_str = inputstring.find("{"); 
     ent_nam_end = inputstring.find("}"); 
     ent_nam_substring = inputstring.substr(ent_nam_str + 1, ent_nam_end - (ent_nam_str + 1));   // Extract Entry Heading End 


     pag_num_substring = inputstring.substr(ent_nam_end + 1, inputstring.length() - ent_nam_substring.length()); // Extract Page Number Start 
     pag_num_str = pag_num_substring.find("{"); 
     pag_num_end = pag_num_substring.find("}"); 
     page_number = pag_num_substring.substr(pag_num_str + 1, pag_num_end - (pag_num_str + 1)); // Extract Page Number End 


    } 
    } 
} 
return 0; 

}

當第一行輸入完成處理時page_Number ='2';和「ent_nam_substring =」系列|(「

在地圖中」系列「是此行的關鍵字,」|(「表示開始於第2頁的該標題的頁範圍的開始。我需要做什麼掃描輸入的每一行,如果不存在,則插入一個鍵,如果確實如此,則將下一個頁碼推到與該鍵關聯的矢量上,直到到達「|)」,表示該標題的頁面範圍的結束。

我的其他相關問題是,如果我正在進行不區分大小寫的比較以便地圖保持按鍵排序,那麼我是否必須每次都明確地調用比較,或者是否需要在地圖聲明中定義和聲明該比較只要執行插入操作,地圖是否會使用它?

對不起,我造成了一個缺乏知識,任何有用的反饋意見,將不勝感激,因爲我的2本教科書沒有提供給我我正在尋找的答案。

回答

0

一旦你定義了比較運算符,地圖自動自動處理它的使用。你不必調用它。

順便說一句,stricmp是不可移植的。在Unux上,你可能需要strcasecmp。這應該做的伎倆:

#ifndef WIN32 
    #define stricmp strcasecmp 
#endif 

關於你的問題的其餘部分,你解釋你的代碼應該做的,但你忘了提到它實際上做什麼,而不是...