2012-03-10 2 views
1

저는 열거 형을 벡터에 배치하는 프로젝트를 진행하고 있습니다. 나는 벡터에서 그런 기능을 어떻게 얻을 수 있는지 궁금했다.벡터에 반복자를 표시합니다.

약 5 가지 방법으로 시도했지만 그 중 아무 것도 작동하지 않습니다. MSDN 벡터 (벡터 :: end()를 통해 읽은 것은 연산자가 < <이 ii를 반복자로 허용하지 않을 때까지 가장 유용하게 보였다.

누가 나를 도울 수 있습니까?

vector<int>::iterator ii; 
for(ii = things.begin(); ii != things.end(); ii++){      //764 
    cout << "thing(" << (int)ii << "): " << toString(things[ii]) << endl; //765 
} 

했지만이 중 하나가 이해가되지 않거나 내가 해결하는 방법을 알아낼 수없는 오류가 발생합니다

1>c:\...\Project.cpp(764): error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion) 
1>c:\...\Project.cpp(765): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion) 
1>c:\...\Project.cpp(765): error C2679: binary '[' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion) 
+1

어떤 종류의 당신은 너무 같은 벡터로 값을 입력 할 수 있습니다

vector <int> things; 

:로 – Yaniro

+0

것은'toString (thing)'을 작성한 enum입니다. (테스트를 마친) – gardian06

+0

이터레이터는 인덱스가 아니라 포인터와 비슷하다.'thing [ii]'는 완전히 잘못되어'* ii'를 사용한다. 반복자를 출력하는 것은 의미가 없다. 라인 764는 괜찮습니다. 왜 컴파일러가 불평하는지 잘 모릅니다. 같은 오류를 나타내는 10 행 프로그램을 만들려고합니다. –

답변

1

things

선언되어야한다 '사물'인가? 또한 루프의 각 단계 값은`* ii`에 있습니다. 'ii'는 벡터의 현재 위치를 가리 킵니다. 루프 카운터를 보여 주어야한다면, 다른 변수가 필요합니다 (for 루프에서`ii`와 함께 증가 할 수있는 또 다른 int).
+1

양자 택일로 열거 형과 같은 다른 타입을 사용한다면'vector things;'라고 말하고 iterator가 선언 될 때'vector :: iterator'가 될 것입니다 – gardian06

2

보십시오.

cout << "thing(" << (ii - things.begin()) << "): " << toString(*ii) << endl; 
+0

이것은 원래의 구현 인 – gardian06

+0

에 더 많은 에러를 발생시킨다. 벡터 반복자의 타입을 변경 한 후에 작동한다. 마지막으로 무시합니다 – gardian06

2

반복자는 거의 포인터처럼 동작 : 그들은 값의 위치를 ​​표시하고이 값을 얻기 위해이를 역 참조해야합니다

std::cout << *ii; 
4

이 작업을 수행하는 올바른 일반적인 방법은

for(std::vector<int>::const_iterator ii=things.begin(); 
     ii != things.end(); ++ii) 
{    
    std::cout << "thing(" 
       << std::distance(things.begin(), ii) 
       << "): " << *ii << std::endl; 
} 
입니다

은 이터레이터를 역 참조하고 std :: distance를 사용하여 처음부터 거리를 가져옵니다.

더 많은 경우 전체 네임 스페이스를 가져 오는 것이 일반적으로 바람직하지 않습니다. 명시 적 using 문이나 네임 스페이스가있는 접두사 형식을 사용하는 것이 좋습니다.

일반적으로 이터레이터에 접두사 증가 연산자를 사용하는 것이 더 바람직합니다.

흥미로운 서식을 지정하지 않으면 'toString'을 int에 적용 할 필요가 없습니다. 스트림 연산자가 정의되어 있기 때문입니다. 그런 다음

things.push_back(1); 
things.push_back(2); 

이 같은 반복 :

for (vector <int>::iterator i = things.begin(); i != things.end(); ++i) 
{ 
    cout << "things(" << (i - things.begin()) << "): " << toString(*i) << endl; 
} 
+0

int에 toString()을 수행하지 않습니다. 전체 열거 형에서 – gardian06

+0

에 대한 전체 설명을 수행하고 있습니다. 컴파일러에 의존하는 전체 네임 스페이스를 포함하는 것에 대해 일부 컴파일러는 필요한 모든 항목을 적극적으로 찾습니다. 클래스/멤버를 네임 스페이스에 포함하고 그 중 하나만 포함하면 나머지는 모두 포함됩니다. 대부분의 경우 네임 스페이스가 대부분 가볍기 때문에 전체 네임 스페이스를 포함하는 것이 좋지 않은 유일한 경우는 공유 네임이나 구성원 중 하나 인 여러 네임 스페이스를 사용하는 경우입니다. – gardian06

+0

표준은 네임 스페이스는 컴파일러가 아닙니다. 네임 스페이스를 사용하는 것은 현재 네임 스페이스를 가져온 네임 스페이스와 병합하는 것과 동일합니다. 현재 네임 스페이스가 현재 네임 스페이스이면 네임 스페이스의 장점을 무시하고 부정합니다. – 111111