作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
好吧,这可能真的是个菜鸟问题,但我希望有一些我还不知道的东西。
我检查一个文件,检查每行有哪个字符串,根据字符串值我为它执行不同的函数(或多个函数)。
我现在是这样做的:
编辑:我需要在 if 内使用 if-else-if 范围之外的变量,更新代码:
string s1 = "used";
string s2 = "in";
string s3 = "functions";
if(str == "something"){
something = process(s1, s2);
}else if(str == "something else"){
something = process(s2, s3);
}else if(str == "something more"){
something = process(s1, s3);
something = process(s1, s2);
}else if(str == "something again"){
// do more stuff
}else if(str == "something different"){
// do more stuff
}else if(str == "something really different"){
// do more stuff
}
我担心这会变得“慢”,如果行很多,我必须重复这些其他内容......
我尝试使用 switch() 语句,但显然它在这里不起作用,这里有类似 switch() 的东西可以使用吗?
最佳答案
如果你只想执行不同的函数,你可以使用从字符串到函数指针或仿函数的映射,比如boost::function
。/tr1::function
:
void f1() { /* ... */ }
void f2() { /* ... */ }
// ... creating the map:
typedef void (*FuncPtr)();
typedef std::map<std::string, FuncPtr> FuncMap;
FuncMap fnMap;
fnMap["something"] = &f1;
fnMap["something else"] = &f2;
// ... using the map:
FuncMap::const_iterator it = fnMap.find(str);
if (it != fnMap.end()) { // is there an entry for str?
it->second(); // call the function
}
至于传递参数,根据目前给出的详细信息,我可能会将行的未解析的剩余部分或字符串标记列表传递给函数,并让它们按他们认为合适的方式处理:
void f1(const std::vector<std::string>& tokens) { /* ... */ }
// ...
typedef void (*FuncPtr)(const std::vector<std::string>&);
typedef std::map<std::string, FuncPtr> FuncMap;
// ...
std::vector<std::string> tokens = /* ...? */;
FuncMap::const_iterator it = fnMap.find(str);
if (it != fnMap.end()) {
it->second(tokens);
}
您还可以查看 Boost.FunctionTypes 中的解释器示例(header,source file)是否与您的场景相似。
关于c++ - 如何遍历字符串数组并为不同的字符串应用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3030033/
我是一名优秀的程序员,十分优秀!