我试图找到答案,但我得到的是如何实现以非零索引开头的数组的答案。某些语言(例如pascal)默认提供此功能,例如,您可以创建一个数组,例如
var foobar: array[1..10] of string;
我一直在想:你为什么要让数组索引不以0开头?
我想初学者可能更熟悉数组以1开头而最后一个索引是数组的大小,但从长远来看,程序员应该习惯于从0开始的值。
我能想到的另一个目的:在某些情况下,索引实际上可以代表相应数组条目中包含的内容。例如,您希望获得数组中的所有大写字母,将索引作为相应字母的ASCII代码可能很方便。但它很容易减去一个常数值。在这个例子中,您可以(在C中)简单地执行这样的操作,获取所有大写字母并使用ascii-code 67访问该字母:
#define ASCII_SHIFT 65
main()
{
int capital_letters[26];
int i;
for (i=0; i<26; i++){
capital_letters[i] = i+ASCII_SHIFT;
}
printf("%c\n", capital_letters[67-ASCII_SHIFT]);
}
此外,如果您想通过某种键访问条目,我认为您应该使用哈希表。
有人可能反驳:为什么索引始终以0开头?嗯,这种方式很简单。当你在声明一个数组时必须输入一个索引时,你会更快。此外,您始终可以确保第一个条目是数组[0],最后一个条目是数组[length_of_array-1]。其他数据结构通常以0开头也很常见。例如,如果您读取二进制文件,则从第0个字节开始,而不是第一个字节。
现在,为什么有些编程语言有这个“功能”,为什么有些人会问如何用C / C ++这样的语言实现这个?有没有一种情况,以非零索引开头的数组更有用,甚至,从0开始的数组无法完成某些事情?
答案 0 :(得分:2)
如果您的索引意味着什么,例如来自数据库或其他类似的id,然后它很有用。
哦,你不能使用哈希,因为你想将它与其他需要数组的代码一起使用。
例如,Rails复选框。它们作为数组从Web表单传递,但在我的代码中,我想访问udnerlying数据库对象。数组索引是id,et voila!
答案 1 :(得分:1)
基于非零的数组是具有非整数的序数索引的数组的自然扩展。在Pascal中,您可以使用以下数组:
var
letter_count : array['a'..'z'] of integer;
或者:
type
flags = (GREEN, YELOW, RED);
var
flags_seen = array[flags] of boolean;
经典是具有负索引的数组:
zero_centered_grid = array[-N..N,-N..N] of sometype;
这个想法是:
只有从零开始的数组的语言使用定义明确的后者,并为其余语言高效实现字典/地图。