use*_*742 3 c++ string hash performance
给定一系列命令和必须为每个命令运行的非常独特的代码:
if(cmd == "cmd.setBoosterRocket")
...
else if(cmd == "cmd.windSales")
...
else if(cmd == "cmd.selfDustruct")
...
else if(cmd == "cmd.unleashHounds")
...
Run Code Online (Sandbox Code Playgroud)
这可能如何优化?被放到一个switch语句中,那是什么?
我考虑过制作一个哈希向量:
std::hash<std::string> hasher;
for(std::string command : m_commandList)
m_mashes.push_back(hasher(command)
Run Code Online (Sandbox Code Playgroud)
但是向量不能作为 switch case 语句的一部分访问,因为它不是 constexpr。字符串命令列表在编译时是已知的,我可能会对哈希值进行硬编码……但这似乎不是一个好主意。
一种可能的方法是标记化:创建一个enum类型和一个字典。通过这种方式,您可以利用开关(以比硬编码哈希更对程序员和编译器友好的方式)并且只有对数复杂度。
enum Command {SET_BOOSTER_ROCKET, WINDSALES, ETC};
const std::map<std::string, Command> commands = {
{"cmd.setBoosterRocket", SET_BOOSTER_ROCKET},
{"cmd.windsales", WINDSALES},
{"othercommands", ETC},
};
Run Code Online (Sandbox Code Playgroud)
进而
auto cmd_it = commands.find(cmd);
if(cmd_it == commands.end()) { // ERROR }
switch(cmd_it->second){
case SET_BOOSTER_ROCKET:
// your code
break;
case WINDSALES:
// your code
break;
// etc
}
Run Code Online (Sandbox Code Playgroud)
如果你有很多东西要开始,像这样标记你的命令可能有点乏味,但它在可扩展性和可读性之间有一个很好的平衡。
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |