带字符串的C/C++开关案例

Luk*_*uke 31 c++

可能重复:
C/C++:切换非整数

嗨,我需要在开关盒中使用一个字符串.到目前为止,我的解决方案是用哈希函数计算字符串的哈希值.问题是我必须手动预先计算字符串的所有哈希值.有更好的方法吗?

h=_myhash (mystring);
switch (h)
{
case 66452:
   .......
case 1342537:
   ........
}
Run Code Online (Sandbox Code Playgroud)

ten*_*our 36

只需使用if() { } else if () { }链条.使用哈希值将成为维护的噩梦.switch意图是一个低级别的陈述,不适合字符串比较.


Ton*_*ony 15

您可以使用标准集合将字符串映射到函数指针; 找到匹配项时执行该功能.

编辑:使用我在评论中给出链接的文章中的示例,您可以声明一个函数指针类型:

typedef void (*funcPointer)(int);
Run Code Online (Sandbox Code Playgroud)

并创建多个函数来匹配签名:

void String1Action(int arg);
void String2Action(int arg);
Run Code Online (Sandbox Code Playgroud)

地图是std::stringfuncPointer:

std::map<std::string, funcPointer> stringFunctionMap;
Run Code Online (Sandbox Code Playgroud)

然后添加字符串和函数指针:

stringFunctionMap.add("string1", &String1Action);
Run Code Online (Sandbox Code Playgroud)

我没有测试过我刚刚发布的任何代码,这是我的头脑:)


Pup*_*ppy 7

通常,您将使用散列表和函数对象,两者都可用于Boost,TR1和C++ 0x.

void func1() {
}
std::unordered_map<std::string, std::function<void()>> hash_map;
hash_map["Value1"] = &func1;
// .... etc
hash_map[mystring]();
Run Code Online (Sandbox Code Playgroud)

这在运行时稍微增加了一些,但是可维护的数量要多出几倍.散列表提供O(1)插入,查找等,这使得它们与汇编式跳转表具有相同的复杂性.


Wan*_*ang 1

您可以使用该字符串来索引函数指针的哈希表。

编辑:glib 有一个哈希表实现,支持字符串作为键和任意指针作为值:http://library.gnome.org/devel/glib/stable/glib-Hash-Tables.html