结构表。 if ... else if else,else if ... alternative

时间:2015-11-09 20:07:55

标签: c++ performance if-statement

我做了一个"替代"到一个巨大的if列表.. else if .. else if ..... statement:

#include <iostream>

void test_func_ref();

struct transition_table
{
    char trans_key_1;
    char trans_key_2;
    void(&func_ref)();
};

int main() {

    transition_table test_table[] = {
        { 'A','B', test_func_ref },
        { 'B','Q', test_func_ref },
        { 'D','S', test_func_ref },
        { 'E','Q', test_func_ref },
        { 'B','W', test_func_ref },
        { 'F','Q', test_func_ref },
        { 'B','S', test_func_ref },
        { 'S','Q', test_func_ref },
        { 'B','X', test_func_ref },
        { 'R','R', test_func_ref },
        { 'B','O', test_func_ref },
        { 'K','Q', test_func_ref },
        { 'J','I', test_func_ref }
    };

    char choice1,choice2;

    std::cin >> choice1 >> choice2;

    for (int i = 0; i < (sizeof(test_table) / sizeof(test_table[0])); i++) {
        if (choice1 == test_table[i].trans_key_1)
            if (choice2 == test_table[i].trans_key_2) {
                //Code here
                std::cout << std::endl;
                std::cout << "This is equal to table row " << i << std::endl;
                test_table[i].func_ref();
            }
    }

    system("pause");
    return 0;
}

void test_func_ref() {
    std::cout << "Voided function called" << std::endl;
}

在没有if..else if语句块的情况下,还有其他(更漂亮吗?高效?)方式吗?

我认为这个方法比if ... else if语句列表稍微慢一点?

1 个答案:

答案 0 :(得分:0)

由于您使用列表作为查找表来查找匹配对的唯一值,因此您可以使用std::map代替:

#include <iostream>
#include <map>
#include <string>
using namespace std;

void test_func(char, char);

typedef void(&func_ref)(char, char);

static map<int,func_ref> tbl = {
    { 'A' << 8 | 'B', test_func },
    { 'B' << 8 | 'Q', test_func },
    { 'D' << 8 | 'S', test_func },
    ...
    { 'K' << 8 | 'Q', test_func },
    { 'J' << 8 | 'I', test_func }
};

int main() {
    char a, b;
    while (cin >> a >> b) {
        auto fp = tbl.find(a << 8 | b);
        if (fp != tbl.end()) {
            fp->second(a, b);
        }
    }
    return 0;
}

void test_func(char a, char b) {
    std::cout << "Voided function called: " << a << ":" << b << std::endl;
}

'A' << 8 | 'B'表达式提供了将两个字符组合成单个int键的技巧,方法是将第一个char转换为int的高8位,并且 - 将第二个char放入低8位。

请注意,查询不再需要代码中的显式循环,因为tbl.find(a << 8 | b)调用会搜索您。

Demo.