#objective-c #clist
#objective-c #клист
Вопрос:
У меня есть cpp-код, в котором объекты struct помещаются в CLISTS
. Я переношу этот код в Objective C.
CLIST похож на двусвязный список с .RemoveAt
, .GetAt
, .InsertBefore
.GetNext
, .GetHeadPosition
, функциями. ,,,,,,,,,,,.
Как реализовать то же самое в Objective C
. Нужно ли мне реализовывать двусвязный список в Objective C.Is есть какие-либо другие предопределенные методы для его использования.
Ответ №1:
Предположительно, КЛИСТ является циклическим? Отсюда GetHeadPosition
?
В любом случае, NSArray
(или, NSMutableArray
в данном случае, поскольку вы хотите выполнять вставку) это обычный способ сохранения упорядоченных списков в Objective-C.
Для RemoveAt
используйте removeObjectAtIndex:
. Для GetAt
используйте objectAtIndex:
. Для InsertBefore
вы, вероятно, захотите написать что-то вроде:
- (void)insert:(id)objectToInsert before:(id)referenceObject
{
int index = [array indexOfObject:referenceObject];
if(index == NSNotFound) return; // or whatever you'd expect.
// Maybe object is just inserted at the end?
index = index - 1;
if(index < 0) index = [array count];
[array insertObject:objectToInsert atIndex:index];
}
(что, вероятно, было бы лучше в категории NSArray, но вы поняли суть)
Для GetNext
и GetHeadPosition
вы, вероятно, захотите сохранить позицию вашего массива в отдельной переменной. Итак, для GetNext:
arrayPosition = (arrayPosition 1)%[array count];
return [array objectAtIndex:arrayPosition];
И для GetHeadPosition просто:
return arrayPosition;
РЕДАКТИРОВАТЬ: для перебора NSArray самый простой способ на самом деле — игнорировать что-либо явное и просто использовать:
for(ObjectType *object in array)
{
/* do something with object */
}
Обычно это означает, что вам на самом деле не нужен аналог GetNext, но вы не можете изменять массив во время выполнения этого цикла, поэтому его не всегда можно использовать.