복사하지 않고 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로 인해 기존 데이터가 재 할당되지 않습니다.
'programing' 카테고리의 다른 글
POST 매개 변수를 사용하여 UIWebView를 통해 웹 페이지로드 (0) | 2021.01.17 |
---|---|
Python Imaging Library에서 크기가 조정 된 이미지의 품질을 조정하는 방법은 무엇입니까? (0) | 2021.01.17 |
C # 캐스트 전체 어레이? (0) | 2021.01.17 |
Python의`urllib2` : Wikipedia 페이지를`urlopen` 할 때 403 오류가 발생하는 이유는 무엇입니까? (0) | 2021.01.17 |
체크 박스가있는 Android ListView 및 모든 클릭 가능 (0) | 2021.01.17 |