STL 벡터 스토리지가 항상 인접하다고 가정하는 것이 안전합니까?

StackOverflow https://stackoverflow.com/questions/247738

  •  05-07-2019
  •  | 
  •  

문제

크기 조정 된 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 a vector<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();

네.

틀림없이 인접해야합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top