2017-01-09 6 views
2

answer to another question에서 지적한 것처럼 기본 요소 인 인접한 버퍼의 재 할당으로 인해 벡터의 요소에 대한 모든 포인터가 벡터에 추가 된 후 잘못된 요소가 될 수 있습니다.std :: vector에 요소를 추가하여 영향을받는 참조에 대한 처리

컴파일 타임에이 문제를 안전하게 처리 할 수있는 방법이 있습니까?

데이터 구조를 변경 한 후 참조가 유효하지 않은 상황을 처리하거나 피할 수있는 모범 사례가 있습니까?

+0

in C# iterat 동안 엘리먼트를 추가 할 때 예외가 생깁니다. 또는 활성 상태입니다. C++에서이 동작을 재현 할 수 있습니까? – wotanii

+0

벡터에 요소에 대한 참조를 저장할 때마다 컴파일러에게 오류가 발생하도록 말할 수 있습니까? 그렇다면 색인을 기준으로 항상 요소를 가져와 문제를 해결할 수 있습니다. – wotanii

답변

-1

std :: vector 자체에 대한 포인터 또는 참조가 변경되지 않습니다. 변경할 수있는 것은 구현 의존적 인 재 할당 정책으로 인해 std :: vector 내부의 특정 요소의 주소입니다.

충분한 공간을 사전 할당하면 특정 구현 정책에서 릴레이하지 않아야하기 때문에 위험합니다.

std :: vector에 요소의 주소를 저장하는 것은 좋지 않으므로 std :: vector [] 연산자가 매우 빠르므로 요소의 주소 대신 색인을 저장하므로 쉽게 피할 수 있습니다. 이것은 올바른 방법입니다.

+0

이것은 대답이 아닌 주석이어야합니다. 나는 이것이 영업 이익이 의미하는 바라고 가정하는 것이 안전하다고 생각합니다. 단지 불충분하게 말한 것입니다. –

1

데이터 구조를 변경 한 후 참조가 유효하지 않을 수있는 상황을 처리하거나 피할 수있는 모범 사례가 있습니까? 미리 벡터

  • 미리 할당 충분한 공간
  • 대신 참조 배열 객체
  • KEEP 인덱스/포인터 예 std::list

방법을, 자체

  • 이용 다른 컨테이너 객체 할 당신의 최선의 방법은 당신의 상황에 달려 있습니다.