我正在爲學校的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本教科書沒有提供給我我正在尋找的答案。