К чему относится вектор C ++ в Objective-C? - PullRequest
6 голосов
/ 22 января 2012

Я перехожу с Objective-C на C ++ и не уверен, что это за векторы. Я прочитал документацию о них, но я не совсем ясно. Как бы вы объяснили векторы C ++, используя аналогии с Objective-C?

Ответы [ 6 ]

7 голосов
/ 22 января 2012

Они очень похожи на NSMutableArrays, но vector является классом шаблона и поэтому может быть создан для любого типа (совместимого со стандартными шаблонами и библиотеками).NSArrays всегда держите NSObjects.

То есть, если вы имеете в виду std::vector.

1 голос
/ 22 января 2012

В C ++ массив - это просто указатель на непрерывный блок данных - серию элементов.Он не предлагает встроенных методов или более высокой функциональности.

int intArr[] = {0,1,2,3};

- это то же самое, что и

int *intArr = (int *)malloc(4*sizeof(int));
for(int i = 0; i < 4; i++) { intArr[i] = i; }

. Вектор (std :: vector), с другой стороны, являетсяКонтейнер для элементов (в основном, как массив), который также предлагает дополнительные встроенные методы (см .: http://www.cplusplus.com/reference/stl/vector/), такие как

vector<int> intArr;
for(int i = 0; i < 4; i++) { intArr.push_back(i); }
// this yields the same content; i.e. intArr = {0,1,2,3}

И массивы, и векторы могут использоваться в объектах любого типа, int, double, MySpacePirateWizardClass и т. д. Большим бонусом векторов является дополнительная функциональность от встроенных функций, таких как:

int arrSize = intArr.size();  // vector also includes useful information
int *firstElement = intArr.begin();    // methods for creating pointers to elements
intArr.delete(0);             // modify elements
intArr.insert(0, 2);          // modify vector
// now: intArr = {2,1,2,3}

и т. д. и т. д.

Когда я знаю, что не пойдучтобы не хватать места (или рассматривать огромные объемы данных), я всегда использую векторы, потому что они более удобны (даже достаточным аргументом является только метод size ()).

1 голос
/ 22 января 2012

NSArray - это оболочка для CFArray. CFArray может хранить данные любого типа.

Я мало что знаю о C ++, но похоже, что CFArray может делать все, для чего вы бы использовали вектор? При создании CFArray вы указываете ему указатель CFArrayCallBacks, который содержит любую логику, специфичную для хранимого типа данных.

Конечно, вы всегда можете просто переименовать ваш файл Obj-C в * .mm и смешать C ++ с вашей целью-c.

http://developer.apple.com/library/mac/#documentation/CoreFOundation/Reference/CFArrayRef/Reference/reference.html

1 голос
/ 22 января 2012

Вектор C ++ (предположительно, вы имеете в виду что-то вроде std::vector) - это в основном NSArray, за исключением того, что он содержит любой тип, который вы хотите (который является параметром шаблона, например, std::vector<int> содержит int с).Конечно, он не управляет памятью (что делает NSArray), потому что произвольные типы не учитываются.Так, например, std::vector<id> было бы весьма неуместным (при условии, что Obj-C ++).

1 голос
/ 22 января 2012

Они похожи на NSMutableArrays, но могут содержать любой тип данных - указатель или нет.Однако каждый вектор может содержать только один тип за раз.Также, поскольку это C ++, есть меньше функций, например, нет загрузки / сохранения plist.

0 голосов
/ 22 января 2012

Думайте о векторах как о расширенных массивах.

Если вы новичок в C ++, эта страница станет вашим лучшим другом: http://www.cplusplus.com/reference/stl/vector/

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