我做了一个"替代"到一个巨大的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语句列表稍微慢一点?
答案 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)
调用会搜索您。