可能重复:
C/C++:切换非整数
嗨,我需要在开关盒中使用一个字符串.到目前为止,我的解决方案是用哈希函数计算字符串的哈希值.问题是我必须手动预先计算字符串的所有哈希值.有更好的方法吗?
h=_myhash (mystring);
switch (h)
{
case 66452:
   .......
case 1342537:
   ........
}
Ton*_*ony 15
您可以使用标准集合将字符串映射到函数指针; 找到匹配项时执行该功能.
编辑:使用我在评论中给出链接的文章中的示例,您可以声明一个函数指针类型:
typedef void (*funcPointer)(int);
并创建多个函数来匹配签名:
void String1Action(int arg);
void String2Action(int arg);
地图是std::string到funcPointer:
std::map<std::string, funcPointer> stringFunctionMap;
然后添加字符串和函数指针:
stringFunctionMap.add("string1", &String1Action);
我没有测试过我刚刚发布的任何代码,这是我的头脑:)
通常,您将使用散列表和函数对象,两者都可用于Boost,TR1和C++ 0x.
void func1() {
}
std::unordered_map<std::string, std::function<void()>> hash_map;
hash_map["Value1"] = &func1;
// .... etc
hash_map[mystring]();
这在运行时稍微增加了一些,但是可维护的数量要多出几倍.散列表提供O(1)插入,查找等,这使得它们与汇编式跳转表具有相同的复杂性.
您可以使用该字符串来索引函数指针的哈希表。
编辑:glib 有一个哈希表实现,支持字符串作为键和任意指针作为值:http://library.gnome.org/devel/glib/stable/glib-Hash-Tables.html