2010-06-01 4 views
6

필자는 반복자가 가리키는 deque 요소의 인덱스를 반환해야한다. 반복기에서 int를 가져 오는 방법은 무엇입니까?C++에서 이터레이터의 int 인덱스를 얻는 방법은 무엇입니까?

+0

왜 색인이 필요합니까? 당신은 객체를 역 참조 할 수 없으며 그것에 반복 연산을 할 수 있습니까? –

+0

어떻게 그렇게됩니까? iterator를 dereferencing하는 것은 포인터를 역 참조하는 것과 같지 않고 deque의 위치가 아닌 메모리 주소를 알려주지 않을까? – user83

답변

3
std::ptrdiff_t index = std::distance(myDeque.begin(), curIterator); 
9

당신은 사용할 수 있습니다

std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator)); 

은 루틴의 실행 비용을 알고 있어야합니다, 당신이 사용하는 데이터 구조에 따라 달라집니다 however-.

size_t index = some_iterator - some_deque.begin() 

은 분명히이 (. std::list 또는 무엇 이건 예) 모든 반복자 작동하지 않습니다하지만 난 어떤 우아함이 있다는 제출 것 :

+1

아니면 iterator (random, forward 등)의 클래스에 따라 달라진다. –

+0

나는 컨테이너의 각 요소를 통해 거리 스텝을 가정하여 숫자를 찾는다. 그래서 큰 deque를 위해 런타임 비용은 클 것이다. 그러나 내 deque는 10 개 요소보다 크지 않아야합니다. 거리가 int를 반환합니까? index() 호출은 무엇을합니까? – user83

+0

deque가 10 개 이상의 요소를 포함하지 않아야한다면, 대신에'vector'를 사용해야한다고 제안하거나 적어도 deque를 고수하는 좋은 근거가 있어야합니다. index() "call"은'std :: distance'의 반환 값으로 구성된'index'라는 변수입니다. – fbrereto

4

임의 접근 반복자를 들어 당신은 뺄셈을 사용할 수 있습니다 이 기술은 일정한 시간이 필요할 때만 사용할 수 있습니다. 컨테이너에 무작위 액세스 반복자가 없으면 어쨌든 색인을 찾으려고 시도하는 것이 좋습니다. 두 제시된 방법 중

+0

나는이 단순함과 우아함 때문에이 답변을 투표 할 것입니다. 결과를 int에 할당하여 int로 캐스트 할 수 있습니까? – user83

+0

int에 할당 할 수는 있지만 더 높은 경고 수준 (컴파일러 등에 따라 부호없는 -> 부호있는 변환 또는 실제 형식 단축)에서 컴파일러 경고가 표시됩니다.명시 적으로 int로 캐스팅해야하는 것은 약간 짜증나지만, 양면 문자에 20 억 개가 넘는 요소가 없으면 문제를 숨기지 않을 것입니다. 그렇지 않으면 꽤 확신 할 수 없을 것입니다. :) – Peter

2

: 후자는 임의 접근 반복자에만 적용되는 우수성이

std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator)); 

std::ptrdiff_t index = some_iterator - some_deque.begin() 

... - 다른 컨테이너를 대체 할 때 따라서를 , 우연히 값 비싼 연산 (O (n))을 얻지 못한다.

관련 문제