Какова цель массивов, начинающихся с ненулевого индекса? - PullRequest
0 голосов
/ 14 января 2011

Я пытался найти ответы, но получил только ответы о том, как реализовать массивы, начиная с ненулевых индексов.Некоторые языки, такие как паскаль, предоставляют это по умолчанию, например, вы можете создать массив, например

var foobar: array[1..10] of string;

Мне всегда было интересно: почему вы хотите, чтобы индекс массива не начинался с0?

Полагаю, для начинающих может быть более привычным иметь массивы, начинающиеся с 1, а последний индекс равен размеру массива, но в долгосрочной перспективе программистам следует привыкнуть к значениям, начинающимся с 0.

Еще одна цель, о которой я мог подумать: в некоторых случаях индекс мог фактически представлять нечто, содержащееся в соответствующей записи массива.Например, вы хотите получить все заглавные буквы в массиве, может быть удобно иметь индекс, являющийся ASCII-кодом соответствующей буквы.Но довольно просто вычесть постоянное значение.В этом примере вы могли бы (в C) просто сделать что-то вроде этого, получить все заглавные буквы и получить доступ к письму с помощью ascii-кода 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?

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Если ваш индекс что-то значит, например, идентификатор из базы данных или что-то подобное, тогда это полезно.

О, и вы не можете использовать хеши, потому что хотите использовать их с другим фрагментом кода, который ожидает массивы.

Например, флажки Rails. Они передаются из веб-формы как массивы, но в моем коде я хочу получить доступ к уникальному объекту базы данных. Индексом массива является id, et вуаля!

1 голос
/ 15 января 2011

Массивы, отличные от нуля, являются естественным расширением массивов с порядковыми индексами, которые не являются целыми числами.В 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;

Идея состоит в том, что:

  • Многие ошибки индексации могут быть обнаружены во время компиляции, если объявление индексов является более конкретным.
  • Некоторые алгоритмы (кучи приходят на ум) имеют более чистые реализации, когда минимальный индекс равенчто-то отличное от нуля.

Языки с массивами, начинающимися только с нуля, используют хорошо определенные идиомы для последних и имеют эффективные реализации словарей / карт для остальных.

...