STL 벡터 스토리지가 항상 인접하다고 가정하는 것이 안전합니까?
문제
크기 조정 된 STL 벡터가있는 경우 요소 0의 주소를 가져 와서 나머지 벡터가 메모리에서 따라갈 것이라고 가정하는 것이 안전합니까?
예를 들어
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 v가 벡터 인 경우 T가 부질 이외의 다른 유형 인 경우 ID [n] == & v [0] + n 모두 0 <= n <v에 대해 준수합니다. .크기().
(*) ... 그러나 요소를 추가 한 후 배열이 재 할당 (포인터 및 반복자를 무효화)을 조심하십시오.
다른 팁
C ++ 03 표준 추가 된 문구는 벡터 요소가 인접해야 함을 분명히합니다.
C ++ 03 23.2.4 단락 1에는 다음 언어가 포함되어 있습니다. ~ 아니다 C ++ 98 표준 문서 :
a의 요소
vector
연속적으로 저장되므로 IF를 의미합니다v
avector<T, Allocator>
어디T
다른 유형입니다bool
, 그런 다음 정체성을 순종합니다&v[n] == &v[0] + n
모든0 <= n < v.size()
.
Herb Sutter는 블로그 항목 중 하나에서 이러한 변화에 대해 이야기합니다. CRIGE NOT : 벡터는 인접한 보장됩니다:
... 연속성은 실제로 벡터 추상화의 일부입니다. 실제로 C ++ 98 표준이 연속성을 완전히 보장하지 않았다는 것이 발견되었을 때, C ++ 03 표준은 보증을 명시 적으로 추가하기 위해 수정되었습니다.
스토리지는 항상 인접하지만 벡터의 용량이 변경됨에 따라 움직일 수 있습니다.
용량 변경 작업 전에 요소 0 (또는 요소)에 포인터, 참조 또는 반복자가있는 경우 무효화되어 재 할당해야합니다.
std::vector
항목이 연속 어레이에 저장되므로 배열의 선호하는 교체가되므로 플랫폼 의존적 저수준 코드 (Win32 API 호출과 같은)와 인터페이스하는 데 사용될 수도 있습니다. 배열 사용에 대한 포인터를 얻으려면 :
&myVector.front();
네.
틀림없이 인접해야합니다