所以我不是一个专业的开发人员,但我定期编程。我正在寻找编写代码,并寻找一些关于管理正在读取文本文件的解析器的建议,将每行看作一个字符串,并试图确定该行的输入。任何给定的行可以是超过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