2016-06-08 1 views
3

다른 반복자 유형은 반드시 연속 데이터를 가리킨다는 의미는 없지만 RandomAccessIterators가 연속 데이터 버퍼를 가리키는 것처럼 처리 할 수 ​​있는지 궁금합니다. 즉, 데이터에 대한 포인터로 변환 될 수 있습니다. .RandomAccessIterator는 데이터가 메모리에 연속적이라는 것을 의미합니까?

이 가정이 맞습니까? &*it을 항상 안전하게 사용할 수 있고 it이 RandomAccessIterator 인 경우 하나의 요소뿐만 아니라 연속 버퍼까지 포인터를 가져올 수 있습니까?

답변

5

아니요, 유효한 가정은 아닙니다.

from cppreference :

std::vector 반대로

하는 양단의 요소가 연속적으로 저장되지 않는다 : 전형적인 구현은 개별적으로 할당 된 고정 크기 어레이의 시퀀스를 사용하여 표준 라이브러리 자체 std::deque에서 반례있다.

[deque.overview]/1

양단에는 벡터 ([vector])와 같은 랜덤 액세스 반복기를 지원하는 시퀀스 컨테이너 :

std::deque '들 iterator RandomAccessIterator이다.

연속 메모리를 보장하려면 오래 기다릴 필요가 없습니다. C++의 ContiguousIterator에서 보증을 제공합니다.


ContiguousIterator 개념 1

N4284로 끝나는 문서의 순서에 제안하고,`ContiguousIterator` 카테고리를 추가합니다 November 2014

+0

그것을 그 C++ 17 mentionong 가치에 채택되었다. –

+1

[이것은 내가 발견 한 것입니다.] (https://isocpp.org/blog/2014/11/new-standard-library-papers-adopted-for-cpp17). 슬프게도 특정 컨테이너에 보장을 제공하는 개념 일 뿐이며 코드를 위반 한 것처럼 해당 태그를 추가하지 않았습니다. –

관련 문제