IT Share you

STL 벡터 저장소가 항상 연속적이라고 가정하는 것이 안전합니까?

shareyou 2021. 1. 6. 08:09
반응형

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경우 즉, 연속적으로 저장되어있는 vA는 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();

예.

항상 연속적이어야합니다.

참조 URL : https://stackoverflow.com/questions/247738/is-it-safe-to-assume-that-stl-vector-storage-is-always-contiguous

반응형