C++ 中首选和最好的方法是什么:将字母分成 7 组,以便稍后我可以询问 char 是否在第 1、3 或 4 组等中...?我当然可以自己想出几种方法,但我想知道标准并在做这种事情时坚持下去。
0
AEIOUHWY
1
BFPV
2
CGJKQSXZ
3
DT
4
MN
5
L

6
R
C++ 中最好的方法:将字母分成 7 组,这样我以后可以问一个字符是否在第 1、3 或 4 组等中......?
进行“拆分”本身的最有效方法是拥有一个从字母/字符到数字的数组。
// A B C D E F G H...
const char lookup[] = { 0, 1, 2, 3, 0, 1, 2, 0...
switch/case 语句是另一个合理的选择——编译器可以自行决定是创建数组实现还是其他方法。
目前尚不清楚您计划使用这 1-6 个值的用途,但enum
似乎是一个合理的编码选择。这样做的好处是仍然支持您可能对那些特定数值(例如,在 < 比较、流式传输...)中可能有的任何用途,同时比散布在代码中的“魔术”数字常量更易于阅读和编译器检查。任何宽度的常量整数也可能正常工作,但不会有统一的类型。
鉴于所涉及的数据量很少,我可能会按位查找 - 即设置值:
cat1 = 1;
cat2 = 2;
cat3 = 4;
cat4 = 8;
cat5 = 16;
cat6 = 32;
cat7 = 64;
然后只需创建一个包含 26 个值的数组,每个值对应字母表中的每个字母,每个值都包含该字母的类别值。当你想对一个字母进行分类时,你只是categories[ch-'A']
为了找到它。
创建一个查找表。
int lookup[26] = { 0, 1, 2, 3, 0, 1, 2, 0 .... whatever };
inline int getgroup(char c)
{
return lookup[tolower(c) - 'a'];
}
这样称呼
char myc = 'M';
int grp = lookup(myc);
为简洁起见,省略了错误检查。
当然,根据 7 个组所代表的内容,您可以制作枚举而不是使用 0、1、2 等。