多个字符串比较

时间:2016-03-07 18:23:08

标签: c++

我试图在C ++中实现一个非常基本的redis克隆。所以当我得到查询时,我需要解析它们。现在我这样做:

void Query::buildQuery(){
        std::string query_type = lower(args[0]);
        if(query_type == "get"){ //do something }
        else if(query_type == "set"){ //do something }
        else if(query_type == "getbit"){ //do something }
        else if(query_type == "setbit"){ //do something }
        else if(query_type == "zadd"){ //do something }
        else if(query_type == "zcard"){ //do something }
        else if(query_type == "zcount"){ //do something }
        else if(query_type == "zrange"){ //do something }
        else if(query_type == "save"){ //do something }
        else { throw(QueryException("Invalid query type")); }
}

还有其他更短的方法吗?我不想包括除STL之外的任何其他库。

3 个答案:

答案 0 :(得分:3)

如果可以将这些do_something提取到单独的方法中,那么您可以从字符串创建预初始化的哈希映射(unordered_map)到指向成员函数的指针,并执行类似

的操作
(this->*queryHandlers[query_type])();

但是,你必须在很多功能和一个大功能之间做出选择。

答案 1 :(得分:0)

如果没有if...else if,您可以通过switch语句执行此操作。像:

void Query::buildQuery(){
        std::string query_type = lower(args[0]);
        switch(str2int(query_type) ){
            case str2int("set"):// do something 
                break;
            case str2int("getbit"):// do something 
                break;
            ................
            ..........
            default:
                throw(QueryException("Invalid query type")); 
        }
}

根据Serhiy所在的str2int

constexpr unsigned int str2int(const char* str, int h = 0)
{
    return !str[h] ? 5381 : (str2int(str, h+1)*33) ^ str[h];
}

答案 2 :(得分:0)

如果你在英特尔/ AMD处理器上运行并且感觉'勇敢',你可能想看看使用SSE指令的these implementations of strcmp, strlen, etc。那会更快。

至于一般结构,你可以转“set”& “做一些事情”进入一个有测试方法和做某事方法的类。有一个数组,并遍历它调用传递query_type的测试方法。如果对象的测试方法与字符串匹配,则会自动调用do-something方法。