这种切换字符串的方式有效吗?有效率更高吗?

时间:2017-04-09 17:49:47

标签: c string performance switch-statement

我想创建一个程序来切换多个字符串以避免if-else-ladder。

我的想法是创建一个链表并删除某个位置不同的每个节点。然后我可以返回它是什么参数并切换这个数字。

我的代码

trying

int str_switch(char* query, int arg_count, ...) { //Variables int i, j; struct node* args = (struct node*)calloc(arg_count, sizeof(struct node)); va_list list; //va_list -> array int start = 0; //data va_start(list, arg_count); for (i = 0; i < arg_count; i++) { args[i].data = va_arg(list, char*); args[i].prev = i - 1; args[i].next = i + 1; } va_end(list); //start args[0].prev = -1; //end args[arg_count - 1].next = -1; //switch int len = strlen(query); for (i = 0; i <= len; i++) { //i <= len: null character is also compared for (j = start; j != -1; j = args[j].next) { //remove from list if (*(args[j].data + i) != *(query + i)) { //only one element in list if (args[j].prev == -1 && args[j].next == -1) { start = -1; } //first element else if (args[j].prev == -1) { start = args[j].next; args[start].prev = -1; } //last element else if (args[j].next == -1) { args[args[j].prev].next = -1; } //mid element else { args[args[j].prev].next = args[j].next; args[args[j].next].prev = args[j].prev; } } } } //return free((void*)args); return start; } 结构如下所示:

node

小测试程序:

struct node {
    int next;
    int prev;
    char *data;
};

我的问题:这有效吗?我怎么能让它更有效率?我想知道这一点,因为我可能会在未来的项目中使用此代码而我不想因为一些愚蠢的错误而失去性能:)

1 个答案:

答案 0 :(得分:1)

您应该构建一个类似sethashtable甚至trie的数据结构。或者至少qsort列表并执行bsearch以获取索引。当前代码中最大的问题是你在每次调用时都做了很多工作。

如果您的字符串列表在编译时已知,您甚至可以使用gperf生成完美的哈希表。

另一种可能性是GTK+具有GQuark数据类型,它为您提供字符串与唯一整数标识符之间的双向关联。