在数组或开关中搜索?对于替换密码 我用C++中的替换来编码一个经典密码,使用ASCII中所有可打印的字符,我想知道哪个更快?数组中的搜索(编辑:非关联搜索,类似于字母[]={'A','b',…);(线性或二进制)或者一个switch语句?编译器可以优化开关,不是吗?也许区别在于内存使用情况?我的选择是开关,虽然代码更大,但可能我遗漏了一些东西

在数组或开关中搜索?对于替换密码 我用C++中的替换来编码一个经典密码,使用ASCII中所有可打印的字符,我想知道哪个更快?数组中的搜索(编辑:非关联搜索,类似于字母[]={'A','b',…);(线性或二进制)或者一个switch语句?编译器可以优化开关,不是吗?也许区别在于内存使用情况?我的选择是开关,虽然代码更大,但可能我遗漏了一些东西,c++,arrays,algorithm,encryption,switch-statement,C++,Arrays,Algorithm,Encryption,Switch Statement,(也许这个问题似乎是主观的,但我认为这是选择一种或另一种方式的客观原因。对不起,我的英语不好)。为什么需要搜索?只需使用ASCII字符索引的128个条目数组。这基本上是编译器对开关所做的操作。(您可以减去32并使用96个条目的数组,从而节省非可打印项使用的空间。)哪一个更快取决于许多因素:编译器的优化(您必须查看程序集才能知道它的功能)以及如何设置数组 如果性能真的很重要,而且这两种解决方案都很容易实现,我会将它们都实现,并在尽可能真实的设置中对它们进行基准测试,以找出哪一种更快。一个足够智能的

(也许这个问题似乎是主观的,但我认为这是选择一种或另一种方式的客观原因。对不起,我的英语不好)。

为什么需要搜索?只需使用ASCII字符索引的128个条目数组。这基本上是编译器对开关所做的操作。(您可以减去32并使用96个条目的数组,从而节省非可打印项使用的空间。)

哪一个更快取决于许多因素:编译器的优化(您必须查看程序集才能知道它的功能)以及如何设置数组


如果性能真的很重要,而且这两种解决方案都很容易实现,我会将它们都实现,并在尽可能真实的设置中对它们进行基准测试,以找出哪一种更快。

一个足够智能的编译器肯定有机会优化开关,使其成为查找,这比n二进制搜索。但您可以自己进行优化,并获得简短的代码:

char alphabet[] = {
    'Z', 'E', 'B', 'R', 'A', 'S', 'C', 'D', 'F', 'G', 'H', 'I', 'J',
    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'T', 'U', 'V', 'W', 'X', 'Y'
};
// now you can get the ciphertext for a single uppercase character with:
alphabet[ch - 'A'];

为什么需要搜索数组?ASCII字符不多。将替换存储在一个表中,一个查找由一个数组查找组成。@user207442我没有使用关联数组,因为我们还没有在课堂上研究它们。您看过为switch语句生成的程序集吗?编译器不使用数组来实现巫婆。他们使用偏移跳转。@Vlad:GCC有时也使用分支的二叉树。这取决于开关值。@Vlad:GCC使用跳转表,这是有效的跳转目标数组。我在考虑搜索,因为我们在课堂上还没有研究关联数组。我迷失在字母表[ch-'a']你能帮我解释一下上下文吗?是的。这和用字符的ASCII码索引数组的基本思想是一样的。我们知道从a到Z的ASCII码是顺序的,显然
'a'-'a'
是0。所以
'B'-'a'
是1,一直到
'Z'-'a'
都是25。所以它是way索引一个只包含大写字母的数组。哦,对了。我忘了在课堂上我们还没有研究关联数组。从技术上讲,这不是关联数组。它只是一个数组,索引为0到25,对应于A到Z。谢谢你的耐心@John,我现在明白了。