C++ 표준 간 변환:: 벡터 및 C 어레이(복사하지 않음)
데이터를 명시적으로 복사하지 않고 std::vector와 그 기초가 되는 C 어레이 int* 사이에서 변환할 수 있으면 좋겠습니다.
std::벡터는 기본 C 어레이에 대한 액세스를 제공합니까?이런 걸 찾고 있어요
vector<int> v (4,100)
int* pv = v.c_array();
편집:
또한, 역순으로 할 수 있습니까? 즉, I have to initialize the converse, 즉,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
.
또한 벡터가 파괴되면 기본 배열도 삭제됩니다.
c++11에서는 벡터::data()를 사용하여 C 배열 포인터를 얻을 수 있습니다.
int* pv = &v[0]
이것은 다음 경우에만 해당된다는 점에 유의하시기 바랍니다.std::vector<>
, 다른 표준 컨테이너에서는 동일한 작업을 수행할 수 없습니다.
Scott Meyers는 그의 책에서 이 주제를 광범위하게 다루고 있다.
매우 제어된 조건일 경우 다음을 수행할 수 있습니다.
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
'programing' 카테고리의 다른 글
apk로 컴파일하지 않고 Android 프로젝트를 라이브러리로 Import하는 방법(Android studio 1.0) (0) | 2022.12.26 |
---|---|
Disconsid Py를 사용하는 Python3 및 MariaDB (0) | 2022.12.26 |
file_get_contents("php://input") 또는 $HTTP_RAW_POST_DATA, JSON 요청 본문을 가져오려면 어떤 것이 좋습니까? (0) | 2022.12.26 |
Java에서 Selenium-WebDriver에 몇 초 동안 대기하도록 요청하려면 어떻게 해야 하나요? (0) | 2022.12.26 |
도커 컨테이너, 메모리 소비량 및 로그 (0) | 2022.12.26 |