Konwersja pomiędzy C++ std::vector I C array bez kopiowania

Chciałbym mieć możliwość konwersji pomiędzy std:: vector i jej podstawową tablicą C int* bez jawnego kopiowania danych.

Czy std::vector zapewnia dostęp do bazowej tablicy C? Szukam czegoś takiego

vector<int> v (4,100)
int* pv = v.c_array();

EDIT:

Również, czy możliwe jest wykonanie converse, tzn. jak zainicjować std::vector z tablicy C bez kopiowania?

int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv);
Author: James McNellis, 2009-11-14

5 answers

Możesz otrzymać wskaźnik do pierwszego elementu w następujący sposób:

int* pv = &v[0];

Ten wskaźnik jest ważny tylko tak długo, jak długo wektor nie jest realokowany. Realokacja następuje automatycznie, jeśli wstawisz więcej elementów, niż zmieści się w pozostałej pojemności wektora (czyli Jeśli v.size() + NumberOfNewElements > v.capacity(). Możesz użyć v.reserve(NewCapacity), aby upewnić się, że wektor ma pojemność co najmniej NewCapacity.

Pamiętaj również, że gdy wektor zostanie zniszczony, tablica bazowa również zostanie usunięta.

 89
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-14 05:09:18

W c++11, możesz użyć vector::data() aby uzyskać wskaźnik tablicy C.

 26
Author: m.elahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-31 08:59:35
int* pv = &v[0]

Zauważ, że tak jest tylko w przypadku std::vector<>, nie możesz zrobić tego samego z innymi standardowymi kontenerami.

Scott Meyers szeroko omawia ten temat w swoich książkach.
 20
Author: Ðаn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-14 03:36:01

Jeśli masz bardzo kontrolowane warunki, możesz po prostu zrobić:

std::vector<int> v(4,100);
int* pv = &v[0];

Ostrzegamy, że będzie to działać tylko tak długo, jak długo wektor nie będzie musiał rosnąć, a wektor nadal będzie zarządzał żywotnością bazowej tablicy (to znaczy, nie usuwaj pv). Nie jest to rzadka rzecz podczas wywoływania bazowych interfejsów API C, ale zwykle robi się to za pomocą nienazwanej tymczasowej, a nie poprzez tworzenie jawnej zmiennej int*.

 17
Author: Drew Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-14 03:37:36

Jednym ze sposobów ochrony przed zmianami wielkości jest zarezerwowanie maksymalnej przestrzeni (lub większej), której będziesz potrzebować:

std::vector<int> v(4,100); //Maybe need 
v.reserve(40);             //reallocate to block out space for 40 elements

Zapewni to, że push_backs nie spowoduje realokacji istniejących danych.

 0
Author: user1270710,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 21:52:55