Я должен не согласиться с ответом на bbum. A NSPointerArray
- это массив, а не разреженный массив, и между ними существуют важные различия.
I настоятельно рекомендовать, чтобы решение bbums не использовалось.
Имеется документация для NSPointerArray
here.
Какао уже имеет объект массива, определенный классом NSArray
. NSPointerArray
наследует от NSObject
, поэтому он не является прямым подклассом NSArray
. Однако документация NSPointerArray
определяет класс как таковые:
NSPointerArray is a mutable collection modeled after NSArray but it can also hold NULL values
Я сделаю аксиоматическое предположение, что это определение из документации утверждает, что это «логический» подкласс NSArray
.
Definitions-
А «общий» массив: коллекция элементов, каждый из которых имеет уникальный номер индекса, связанный с ним.
Массив без квалификаций представляет собой: «Общий» массив, в котором индексы элементов имеют следующие свойства: Индексы для элементов в массиве начинаются с 0
и увеличиваются последовательно. Все элементы массива содержат номер индекса меньше, чем количество элементов в массиве. Добавление элемента в массив должно быть в индексе + 1 последнего элемента в массиве, или элемент может быть вставлен между двумя существующими номерами индексов элементов, что приводит к тому, что индексный индекс всех последующих элементов будет увеличен на единицу. Элемент с существующим номером индекса может быть заменен другим элементом, и эта операция не изменяет номера индексов существующих операций. Поэтому вставка и замена - это две различные операции.
Редкий массив: «общий» массив, где номер индекса первого элемента может начинаться с любого числа, а номер индекса последующих элементов, добавленных в массив, не имеет никакого отношения к или ограничениям на основе других элементов в массив. Вставка элемента в разреженный массив не влияет на число индексов других элементов в массиве. Вставка элемента и замена элемента обычно являются синонимами в большинстве реализаций. Количество элементов в разреженном массиве не имеет отношения к номерам индексов элементов в разреженном массиве.
Эти определения содержат определенные прогнозы о поведении массива «черного ящика», которые можно тестировать. Для простоты мы сосредоточимся на следующем соотношении:
В массиве индексный индекс всех элементов массива меньше, чем количество элементов в массиве. Хотя это может быть справедливо для разреженного массива, это не является обязательным требованием.
В комментарии к bbum, я заявил следующее:
NSPointerArray
не разреженный массив, и не ведут себя, как один. Вам все равно придется заполнять все неиспользуемые индексы указателями NULL
. Выход из [pointerArray insertPointer:@"test" atIndex:17];
на свеже экземпляр NSPointerArray
:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSConcretePointerArray insertPointer:atIndex:]: attempt to insert pointer at index 17 beyond bounds 0'
Он заявил, что не доказывает, то поведение NSPointerArray
выше нарушает само определение разреженного массива. Эта часть сообщения об ошибке раскрывает: attempt to insert pointer at index 17 beyond bounds 0'
, в частности, часть о том, что нужно добавить первый новый элемент по индексу 0
.
bbum затем комментарии:
Это неправильно. Вы не смогли вызвать -setCount: чтобы установить емкость достаточного размера.
Это без бы бессмысленно «установить счетчик» числа элементов в разреженном массиве. Если NSPointerArray
был разреженным массивом, можно было бы ожидать, что после добавления первого элемента в индекс 17 подсчет количества элементов в NSPointerArray
будет одним. Тем не менее, после консультации с bbums, количество предметов в NSPointerArray
после добавления первых позиций составляет 18
, а не 1
.
QED- Показано, что NSPointerArray
представляет собой массив, и для целей этой дискуссии - NSArray
.
Кроме того, bbum делает следующие дополнительные комментарии:
NSPointerArray безусловно, делает поддержку отверстий.
Это доказуемо неверно. Массив требует, чтобы все содержащиеся в нем элементы содержали что-то, даже если это что-то «ничего». Это не относится к разреженному массиву. Это само определение «дыры» для целей этого обсуждения. A NSPointerArray
не содержит holes
в разреженном смысле этого термина.
Это была одна из целей написания класса. Сначала нужно установить счет.
Неверно, чтобы «установить счет» разреженного массива.
Является ли внутренняя реализация разреженным массивом или хешем или, и т. Д., Является деталью реализации.
Это правда. Однако документация для NSPointerArray
не содержит ссылок на то, как она реализует или управляет массивом элементов. Более того, он не указывает нигде, что NSPointerArray
«эффективно управляет массивом NULL-указателей».
QED- bbum зависит от незарегистрированного поведения что NSPointerArray
эффективно обрабатывает NULL
указателей через разреженный массив внутри. Будучи недокументированным поведением, это поведение может измениться в любое время или может даже не применяться ко всем видам использования NSPointerArray
. Изменение этого поведения было бы катастрофическим, если наивысший индекс в нем достаточно большой (~ 2^26).
И, по сути, он не реализован как один большой кусок памяти ...
Опять же, это частного детали реализации, что является недокументированными. Это чрезвычайно Плохая практика программирования зависит от этого типа поведения.
Благодарим за быстрый ответ. Я надеялся на постоянное время поиска, но это не так уж плохо. Надеюсь, размеры моего набора данных не будут слишком большими. Благодарю. – 2009-08-30 21:56:13
словарь - это хэшсет, он поддерживает постоянный поиск по времени. – twolfe18
Ах! Я не знал этого. Я предполагал, что это log (N). Спасибо за информацию. – 2009-08-30 22:28:55