В общем да. Если вы работаете на языке с C-подобным синтаксисом (C, C ++, Java), то массивы индексируются с нулевым индексом, а большинство структур данных с произвольным доступом (векторы, списки массивов и т. Д.) Будут индексироваться с нулевым индексом. также.
Начало индексов с нуля означает, что размер структуры данных всегда будет на один больше, чем последний действительный индекс в структуре данных. Конечно, люди часто хотят знать размер, и поэтому удобнее говорить о размере, чем о последнем действительном индексе. Люди привыкли говорить об окончании индексов эксклюзивно, потому что массив a[]
длиной n
элементов имеет свой последний действительный элемент в a[n-1]
.
Существует еще одно преимущество использования исключительного индекса для конечного индекса, который заключается в том, что вы можете вычислить размер подсписка, вычтя включающий начальный индекс из исключительного конечного индекса. Если я позвоню myList.sublist(3, 7)
, то получу подсписок с элементами 7 - 3 = 4
. Если бы метод sublist()
использовал инклюзивные индексы для обоих концов списка, то мне нужно было бы добавить еще 1, чтобы вычислить размер подсписка.
Это особенно удобно, когда начальный индекс является переменной: получение подсписка myList
, начинающегося с i
длиной 5 элементов, составляет всего myList.sublist(i, i + 5)
.
С учетом всего вышесказанного вам следует всегда читать документацию API, а не предполагать, что данный начальный или конечный индекс будет включающим или исключающим. Кроме того, вы должны документировать свой собственный код, чтобы указать, являются ли какие-либо границы включающими или исключающими.