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가 T가 bool이 아닌 다른 유형 인 벡터이면 모든 0 <= n <v에 대해 ID & v [n] == & v [0] + n을 따릅니다. .크기().
(*) ...하지만 배열에 요소를 추가 한 후 배열이 재 할당되는지 (포인터 및 반복기를 무효화)주의하십시오.
C ++ 03 표준은 벡터 요소가 연속적이어야 함을 명확히하기 위해 문구를 추가했습니다.
C ++ 03 23.2.4 단락 1에는 C ++ 98 표준 문서에 없는 다음 언어가 포함되어 있습니다 .
a의 요소는
vector
경우 즉, 연속적으로 저장되어있는v
A는vector<T, Allocator>
곳T
이 아닌 다른 유형은bool
, 다음은 신원을 순종하는&v[n] == &v[0] + n
모든0 <= n < v.size()
.
Herb Sutter는 그의 블로그 항목 중 하나 인 Cringe not : Vector가 연속적임을 보장합니다 .
... 연속성은 사실 벡터 추상화의 일부입니다. 실제로 C ++ 98 표준이 연속성을 완전히 보장하지 않는다는 사실이 발견되었을 때 C ++ 03 표준이 명시 적으로 보증을 추가하도록 수정되었습니다.
스토리지는 항상 연속적이지만 벡터의 용량이 변경되면 이동할 수 있습니다.
용량 변경 작업 전에 요소 0 (또는 임의의 요소)에 포인터, 참조 또는 반복자가 있으면 무효화되며 다시 할당해야합니다.
std::vector
항목이 연속적인 배열에 저장되도록 보장하므로 배열의 선호되는 대체품이며 플랫폼 종속 하위 수준 코드 (예 : Win32 API 호출)와 인터페이스하는 데 사용할 수도 있습니다. 배열에 대한 포인터를 얻으려면 다음을 사용하십시오.
&myVector.front();
예.
항상 연속적이어야합니다.
'IT Share you' 카테고리의 다른 글
dyld : 라이브러리가로드되지 않음 : @rpath with iOS8 (0) | 2021.01.06 |
---|---|
NumPy의 transpose () 메서드는 배열의 축을 어떻게 변경합니까? (0) | 2021.01.06 |
자동 쿠키 처리 C # /. NET HttpWebRequest + HttpWebResponse (0) | 2021.01.06 |
Visual Studio 빌드 전 이벤트 명령 줄에서 파일을 삭제하는 방법 (0) | 2021.01.06 |
Python의 좋은 습관 또는 나쁜 습관 : 파일 중간에 가져 오기 (0) | 2021.01.06 |