크기가 조정 된 STL 벡터가있는 경우 요소 0의 주소를 가져 와서 나머지 벡터가 메모리에서 따라 오는 것으로 가정합니까?STL 벡터 스토리지가 항상 인접 해 있다고 가정하는 것이 안전합니까?
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
크기가 조정 된 STL 벡터가있는 경우 요소 0의 주소를 가져 와서 나머지 벡터가 메모리에서 따라 오는 것으로 가정합니까?STL 벡터 스토리지가 항상 인접 해 있다고 가정하는 것이 안전합니까?
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
예, 유효한 가정 (*) 일 : 배열 사용에 대한 포인터를 얻을 수 있습니다. 는 C++ 03 표준 (23.2.4.1) 발
:
벡터의 요소를 의미 연속적 저장되는 V는 T보다 약간 유형 다른 인 벡터이면 bool이면 신원 확인 & v [n] == & v [0] + n for 모두 0 < = n < v.size().
(*) ...하지만 요소를 추가 한 후 (포인터 및 반복기를 무효화하는) 배열을 재 할당하는 것에주의하십시오.
예.
는 항상 곁에
저장은 항상 연속이다 인접해야하지만 벡터의 용량이 변화로는 이동할 수 있습니다.
용량 변경 작업 전에 요소 0 (또는 요소)에서 포인터, 참조 또는 반복기가있는 경우 해당 요소는 무효화되므로 다시 할당해야합니다.
std::vector
은 항목이 인접한 배열에 저장되어 있으므로 배열을 우선적으로 대체하므로 플랫폼 의존적 하위 수준 코드 (예 : Win32 API 호출)와의 인터페이스에도 사용할 수 있습니다.
&myVector.front();
C++ 03 표준은 벡터 요소가 연속적이어야한다는 것을 분명히하기 위해 문구가 추가되었습니다. vector
의
요소가 연속적 저장된 경우 의미된다
C++ 03 23.2.4 제 1 항은 C++ 98 표준 문서아닌 다음 언어를 포함
T
이bool
이외의 유형입니다v
가vector<T, Allocator>
입니다, 그것은 모든0 <= n < v.size()
에 대한 신원&v[n] == &v[0] + n
순종. 자신의 블로그 항목 중 하나에이 변경 사항에 대한
허브 셔터 회담 Cringe not: Vectors are guaranteed to be contiguous는 :
... 인접성은 벡터 추상화의 사실 부분에 있습니다.사실, C++ 98 표준이 연속성을 완전하게 보증하지 않았다는 것을 발견하면 C++ 03 표준을 에 명시 적으로 추가하여 보증을 명시 적으로 변경했습니다.
감사합니다. 젠장, 2003 아주 간단한 기능. – jokoon
+1 : 답변입니다. "항상"이 아닌 2003 준수 구현 이후로 가정하는 것이 안전합니다. –
초안 표준을 사용 중이거나 아직 비준되지 않은 공식 문서를 사용하는 경우 그렇게 말하십시오. 나는 현재의 표준에서 그런 것을 찾을 수 없었다. –
C++ 0x 초안에서는 23.2.5.1이고 C++ 03에서는 23.2.4.1입니다. 이 문구는 C++ 98 표준에 포함되어 있지 않습니다. 저는 ISO/IEC 14882 : 2003 (E) – Eclipse
을 보았습니다. 나중에 Technical Corrigendum에 추가되었습니다. –