2009-02-27 4 views
1
std::vector< std::vector<coords> >::iterator iter; 
for(iter = characters.begin(); iter != characters.end(); iter++) 
{ 
    std::vector<coords>* cha = iter; // doesn't work. 
} 

// does work. 
std::vector<coords>* character = &characters.at(0); 
coords* first = &character->at(0); 

나는 이유를 모르겠다. iter가 컨테이너가 '포함하고있는'형식의 요소에 대한 포인터가 아닌가?반복자를 통해 다른 벡터 내부의 벡터 요소에 액세스합니까?

누구나 기꺼이이 문제를 해결할 수 있습니까?

으로는 내 말은 작동하지 않습니다

error C2440: 'initializing' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'std::vector<_Ty> *' 

나에게 많은 이해하지 않는.

답변

6

반복기는 포인터처럼 역 참조 될 수있는 유형입니다. 즉, 명시 적 operator*()operator->()입니다. 포인터 일 필요는 없습니다.

벡터의 주소를 얻으려면 &*iter을 사용하십시오.

3

MSN의 대답을 더 명확히하기 위해 반복기를 컨테이너의 개별 항목에 대한 래퍼로 생각할 수 있지만 증분 (++ iter), 감소 (++ iter) 등의 스마트 기능도 있습니다. 기본 데이터 구조는 컨테이너 유형/구현에 따라 연속적인 메모리 블록이 아닐 수 있습니다. 실제 값에 액세스하려면

1) 반복자 derefence는

Type t = *iter;

2) 예를 들어, 컨테이너 형에 대한 포인터로 반복자를 치료 예 수

iter->someFuncOnTheContainerType();

1

나는 그것이 명백하다 (뒤늦은 지혜로). 그러나 당신의 for 루프에서 다음을 시도 할 수도있다.

std::vector<coords> & cha = * iter; 

또한 당신이 요구하는 것이 아니고 단지 FYI이지만 벡터는 임의 액세스 반복기를 지원합니다. 당신은 또한 쓸 수있는 의미 : 당신이 반복자로 다시 변환하기 위해 필요한 경우,

for(size_t i=0; i<characters.size(); i ++) 

을, 당신이 사용할 수 있습니다

characters.begin() + i 

이 일을의 C++ 방법이 아니다, 그것은 일반 반복자를 나누기 철학이지만 그것의 용도가있다.