2012-01-21 14 views

Odpowiedz

6

Są one bardzo podobne do NSMutableArrays, ale vector jest klasą szablonów, więc można go wdrożyć dla dowolnego typu (standard kompatybilny z biblioteką szablonów). NSArrays zawsze trzymaj NSObjects.

Oznacza to, że przy założeniu, że myśli std::vector.

1

Są jak NSMutableArrays ale może posiadać dowolny typ danych - wskaźnik, czy nie. Jednak każdy wektor może posiadać tylko jeden typ na raz. Również jako C++ jest mniej funkcji, np. brak ładowania/zapisywania plików plist.

1

C++ wektor (zapewne na myśli coś takiego std::vector) jest w zasadzie NSArray, oprócz tego, że posiada wszelkiego rodzaju chcesz (który jest parametrem szablonu, na przykład std::vector<int> posiada int s). Oczywiście, to nie robi zarządzanie pamięcią (co NSArray robi), ponieważ nie są dowolne typy zachowują liczona. Na przykład: std::vector<id> byłoby raczej nieodpowiednie (zakładając Obj-C++).

+0

'std :: vector' w rzeczywistości zarządza pamięcią dla ciebie (to jest cały punkt' std :: vector'). Myślę, że chodziło o to, że rzeczy takie jak 'std :: vector ' nie wywołują 'delete' na każdym z elementów' int * ', ani też nie odwołują się do liczenia jego elementów. Inteligentne wskaźniki można wykorzystać do dodania obsługi liczenia odwołań, np. 'std :: vector >'. –

+0

@Insilico: W kategoriach Obj-C "zarządzanie pamięcią" oznacza zliczanie referencji obiektów Obj-C. –

1

NSArray jest owinięcie wokół CFArray. CFArray może przechowywać dowolny typ danych.

Nie wiem zbyt wiele o C++, ale brzmi to tak, jak CFArray może zrobić wszystko, co chcesz użyć wektora? Podczas tworzenia CFArray dasz mu wskaźnik CFArrayCallBacks, który zawiera żadnej logiki, która jest specyficzna dla typu danych są przechowywane.

Oczywiście, zawsze możesz zmienić nazwę pliku Obj-C na * .mm i dodać C++ do celu-c.

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

+0

Myślę, że masz go od tyłu. Znam Objective-C i uczę się C++. – Marty

+0

Och, masz rację, dostałem go od tyłu. Jednak AFAIK wektor jest taki sam jak CFArray, nie tak jak NSArray. –

+0

, który wydaje się być ogólnym konsensusem. dzięki! – Marty

1

W C++ tablica jest w zasadzie tylko wskaźnik do sąsiedniego bloku danych --- szeregu elementów. Nie oferuje żadnych wbudowanych metod ani wyższej funkcjonalności.

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

jest taka sama jak

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

wektora (std :: vector), z drugiej strony, jest kontenerem dla elementów (w zasadzie jak tablica), która oferuje także dodatkowe wbudowane w metodach (patrz: http://www.cplusplus.com/reference/stl/vector/), takie jak

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} 

Obie macierze i wektory mogą być stosowane na wszelkiego rodzaju obiektów, int, double, „MySpacePirateWizardClass” itp duża premia wektorów jest dodatkowy functionalit y z wbudowanych funkcji, takich jak:

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} 

itp.

Kiedy wiem, że nie będę mało przestrzeni (lub patrzę na ogromne ilości danych), zawsze używam wektorów, ponieważ są one tak wygodne (nawet sama tylko metoda size() jest wystarczającym powodem).

Powiązane problemy