Цель C - Как сделать добавить / удалить структуры для динамического массива - PullRequest
1 голос
/ 20 ноября 2010

Мне нужно иметь возможность добавлять и удалять произвольное количество точек в массиве. В C ++ я мог бы легко это сделать, используя vector, что позволяет мне добавлять и удалять элементы любого типа.

Я знаю, что могу хранить структуры в NSMutableArray, используя класс NSValue, но я бы предпочел более быстрый метод, чем создание и уничтожение объектов NSValue постоянно. Есть ли что-то похожее на класс vector в Objective-C или есть другой способ добавления и удаления моих структур в массивы (я бы предпочел не использовать Objective C ++)? Или я застрял с NSMutableArray и NSValue.

РЕДАКТИРОВАТЬ : NSMutableData кажется возможным решением.

Ответы [ 4 ]

5 голосов
/ 20 ноября 2010

NSArray / NSValue - это традиционный способ хранения таких вещей, как CGPoints, в NSArray. Откуда ты знаешь, что это будет слишком медленно, если ты не измеришь это?

2 голосов
/ 20 ноября 2010

Если бы вы не ориентировались на iOS, я бы предложил NSPointerArray, что устраняет необходимость упаковки необработанных типов данных struct в контейнеры NSValue.Однако этот класс (к сожалению) недоступен в iOS.

Apple подтверждает это в своей NSArray документации для iOS под заголовком Альтернативы для подклассов .

Перед созданием пользовательского класса NSArray исследуйте NSPointerArray и соответствующий базовый тип Foundation, CFArray Reference.Поскольку NSArray и CFArray являются «бесплатными мостовыми соединениями», вы можете заменить объект CFArray на объект NSArray в своем коде (с соответствующим приведением типов).Хотя они являются соответствующими типами, CFArray и NSArray не имеют идентичных интерфейсов или реализаций, и вы можете иногда делать вещи с CFArray, которые вы не можете легко сделать с NSArray.Например, CFArray предоставляет набор обратных вызовов, некоторые из которых предназначены для реализации пользовательского поведения retain-release.Если вы укажете реализации NULL для этих обратных вызовов, вы можете легко получить невыдерживающий массив.

Другими словами, вы можете косвенно создать NSArray (или изменяемый аналог), который непосредственно содержит ваштипы объектов.

1 голос
/ 20 ноября 2010

Вы всегда можете создать свой собственный векторный класс esque прямо на C. Ниже приведен пример простого стека (вероятно, более уместно называемого PointStack), который я взломал вместе в качестве доказательства концепции. Создание LinkedLists и т.п. также не будет слишком сложным.

РЕДАКТИРОВАТЬ: я вижу другие решения, которые, вероятно, лучше, поскольку они не заставляют вас заново изобретать колесо .

struct PointVector {
 CGPoint *data;
 int numItems;
 int maxSize;
};

void resize(struct PointVector *v, int newSize);
void pushPoint(struct PointVector *v, CGPoint newPoint);
void popPoint(struct PointVector *v);

void init(struct PointVector *v) {
 v->data = NULL;
 v->numItems = 0;
 v->maxSize = 0;
}

void pushPoint(struct PointVector *v, CGPoint newPoint) {
 if (v->numItems + 1 > v->maxSize)
  resize(v, (v->maxSize ? v->maxSize * 2 : 1));

 v->data[v->numItems++] = newPoint;
}

void popPoint(struct PointVector *v) {
 if (v->numItems)
  v->numItems--;

}

void resize(struct PointVector *v, int newSize) {
 CGPoint *newData = calloc(sizeof(CGPoint), newSize);

 for (int i = 0; i < v->numItems; i++)
  newData[i] = v->data[i];

 if (v->data != NULL)
  free(v->data);

 v->data = newData;
 v->maxSize = newSize;
}
0 голосов
/ 20 ноября 2010

Если это вариант, вы можете смешать использование C ++ и target-c, написать свой основной алгоритм на C ++, а затем переименовать ваши файлы .m в .mm, куда вы будете включать и использовать свой код c ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...