2013-04-16 2 views
1

포인터를 통해 std :: list의 요소에 대한 참조를 가져 오는 경우 해당 요소가 삭제되지 않는 한 해당 포인터는 유효하게 유지되며 해당 요소에 액세스 할 때마다 목록을 탐색해야합니다. ?std :: list는 요소의 메모리에서 위치를 변경합니까?

기본적으로 std :: list는 다른 요소가 추가되거나 제거 될 때 주변 요소를 이동합니까? C++ reference 따르면

I하지 의심

...

답변

3

insert() 방법 반복자의 유효성에 영향을주지와 remove 방법은 제거 된 요소의 반복기의 유효성에 영향을 미친다. 포인터 대신 목록의 요소를 가리키는 약 iterators을 유지하고 싶습니다.

+1

호기심에서, 포인터를 둘러싼 반복기를 유지하는 이점은 무엇입니까? 나는 itterator가 날씨를인지하고 있거나 여전히 유효하지 않다고 추측하고 있습니까? –

+1

아니요, STL 컨테이너에서 특정 요소에 대한 "참조"를 보유하는 것은 자연스러운 방법 일뿐입니다. 반복자를 사용하는 것이 더 좋습니다. 그 이유 중 하나는 STL 알고리즘에 의해 사용될 수 있다는 것입니다. –

+2

@ CodySmith 또 다른 이유는 포인터가 단순히 요소 자체에 도달하는 것 외에는 쓸모가 없다는 것입니다. 예를 들어, 새로운 요소를 삽입하기 전이나 그 지점에서 목록을 횡단하는 등의 새로운 요소를 삽입하는 데 사용할 수 없습니다. 또한 목록의 내부 구현 세부 사항 인 포인터를 유지함으로써 캡슐화를 깨뜨리는 것입니다. – JBentley

4

std::list의 요소에 대한 참조 및 확장명은 컨테이너에서의 제거를 제외하고 대부분의 작업을 통해 유효합니다. 사실 병합, 스플 라이스 및 스왑 멤버 함수를 통해 다른 목록으로 이동할 수도 있으며 여전히 유효합니다.

+0

표준을 통해 원시 포인터와 이터레이터에 대한 보증을 보장합니까? – JBentley

+1

@JBentley : 참조 용으로 보증합니다. 참조가 무효화되지 않으면 포인터가 어떻게 될지 상상할 수 없습니다. –

관련 문제