所以我不是一個專業的開發人員,但我定期編程。我正在尋找編寫代碼,並尋找一些關於管理正在讀取文本文件的解析器的建議,將每行看作一個字符串,並試圖確定該行的輸入。任何給定的行可以是超過1000個不同的關鍵字之一,這是困難的部分。一旦我有了這個關鍵字,我覺得必須有一個更有效的方法來確定它是什麼,而不是實現1000個if-else語句或1000個case-break語句。一旦我匹配給定的關鍵字,我打算跳轉到一個常規例程來實例化該關鍵字類型的對象。我不想在找到我的目標之前進行999次測試,這只是我感覺的浪費。我試着按字母順序將其分解,這大大減少了它,但仍然有大量的if-else語句難以管理。如何確定1000個潛在關鍵字中的給定關鍵字?
我已經發現我不能嵌套超過128個if-else語句,所以我當前的選擇是隻有「if」語句的1000個沒有匹配「else」語句,我知道這是一個不好的做法。所以這裏是我現在的代碼的概括:
if (keyword_str.compare(keyword1)) {
Parse(keyword1); // A general routine to parse all these similarly formatted keywords
}
if (keyword_str.compare(keyword2)) {
Parse(keyword2);
}
if (keyword_str.compare(keyword3)) {
Parse(keyword3);
}
//
//
//
if (keyword_str.compare(keyword999)) {
Parse(keyword999);
}
if (keyword_str.compare(keyword1000)) {
Parse(keyword1000);
}
任何幫助將不勝感激!謝謝!
好了,這裏是我的觀點,但還是有種失去了對如何使用地圖來確定一個對象類型,然後實例化對象。下面是一些代碼片段:
class baseClass
{
public:
baseClass();
~baseClass();
};
//
// keyword1 class declaration
class keyword1 : public baseClass
{
public:
// Constructors
keyword1() { cout << "keyword1 constructor..." << endl;}
~keyword1() { cout << "keyword1 destructor..." << endl;}
protected:
};
//
// keyword2 class declaration
class keyword2 : public baseClass
{
public:
// Constructors
keyword2() { cout << "keyword2 constructor..." << endl;}
~keyword2() { cout << "keyword2 destructor..." << endl;}
protected:
};
//
// keyword3 class declaration
class keyword3 : public baseClass
{
public:
// Constructors
keyword3() { cout << "keyword3 constructor..." << endl;}
~keyword3() { cout << "keyword3 destructor..." << endl;}
protected:
};
//
//*******************
map <string, baseClass> keyword_map;
keyword_map.insert (make_pair ("keyword1", keyword1)); // ########## This is where I'm lost
keyword_map.insert (make_pair ("keyword2", keyword2)); // ########## This is where I'm lost
keyword_map.insert (make_pair ("keyword3", keyword3)); // ########## This is where I'm lost
// Search for keyword
string searching_for = "keyword3";
map <string, baseClass> ::const_iterator it = keyword_map.find(searching_for);
if (it == keyword_map.end()) {
cout << "No keyword found." << endl;
}
else
{
cout << "Found the keyword!" << endl;
it->second; // ########## This is where I'm lost
}
你應該學習表和循環。 – stark 2014-08-28 03:28:19
@stark雖然表和循環是很好的事情要知道,一個'std :: unordered_map'可以正確調度這種東西。更大的問題是*「你真的要定義1000種對象類型嗎?......爲什麼......?」*我提出問題+1,希望知道如何做得更好,而不是僅僅去提前做出堅強的事......這是很多人會做的事情。 :-) – HostileFork 2014-08-28 03:58:30
感謝大家的回覆。這是我第一次使用這個文章,並且我對恢復反饋的速度印象深刻。再次感謝您的幫助。 // // // stark - 我會檢查出來的。 // // // HostileFork - 我會再看看那個容器。我想我可以抓住映射的值,並將其傳遞給通用解析例程。儘管如此,我仍然需要遍歷容器,但這會比1000個if-else/case-break語句更少混亂。謝謝! – 2014-08-28 21:20:55