programing

복사하지 않고 C ++ std :: vector와 C 배열 간 변환

shortcode 2021. 1. 17. 11:17
반응형

복사하지 않고 C ++ std :: vector와 C 배열 간 변환


데이터를 명시 적으로 복사하지 않고도 std :: vector와 기본 C 배열 int *간에 변환 할 수 있기를 원합니다.

std :: vector는 기본 C 배열에 대한 액세스를 제공합니까? 이런 걸 찾고 있어요

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

편집하다:

또한 반대로 std::vector할 수 있습니까? 즉, 복사하지 않고 C 배열에서 어떻게 초기화 합니까?

int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv);

다음과 같이 첫 번째 요소에 대한 포인터를 얻을 수 있습니다.

int* pv = &v[0];

이 포인터는 벡터가 재 할당되지 않는 한 유효합니다. 벡터의 남은 용량에 맞지 않는 것보다 많은 요소를 삽입하면 재 할당이 자동으로 발생합니다 (즉, v.size() + NumberOfNewElements > v.capacity(). v.reserve(NewCapacity)벡터의 용량이 최소 NewCapacity.

또한 벡터가 파괴되면 기본 배열도 삭제됩니다.


int* pv = &v[0]

이는의 경우에만 해당 std::vector<>되며 다른 표준 컨테이너에서는 동일하게 수행 할 수 없습니다.

Scott Meyers는 그의 책에서이 주제를 광범위하게 다룹니다.


C ++ 11에서는 vector :: data () 를 사용하여 C 배열 포인터를 가져올 수 있습니다.


매우 통제 된 조건이있는 경우 다음을 수행 할 수 있습니다.

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

이것은 벡터가 성장할 필요가없는 한만 작동하고 벡터는 여전히 기본 배열의 수명을 관리 할 것입니다 (즉, pv를 삭제하지 마십시오). 이것은 기본 C API를 호출 할 때하는 드문 일이 아니지만 일반적으로 명시 적 int * 변수를 생성하는 대신 이름이 지정되지 않은 임시로 수행됩니다.


크기 변경으로부터 자신을 보호하는 한 가지 방법은 필요한 최대 공간 (또는 그 이상)을 예약하는 것입니다.

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

이렇게하면 push_backs로 인해 기존 데이터가 재 할당되지 않습니다.

참조 URL : https://stackoverflow.com/questions/1733143/converting-between-c-stdvector-and-c-array-without-copying

반응형