2014-03-04 4 views
3

그래서 std :: set에서만 이상한 반복기 버그가 발생했습니다 : 반복기에서 (it + 1)과 같은 간단한 작업을 수행 할 수 없습니다. (유효하지 않은 피연산자 바이너리 표현에 ('표준 : _ 1 : _tree_const_iterator의 * 긴>'와 'INT') 경우를 :C++ std :: set가 컴파일러 오류로 인해 반복자에서 operator +를 사용할 수 없습니다.

void setBug() 
{ 
    std::set<int> values; 

    for (auto it = values.cbegin(); 
     it != values.cend(); ++it) { 
     if ((it + 1) != values.end()) 
      values.insert(*it/*(it + 1)); 
    } 
} 

오류 : 컴파일 오류이 직접 컴파일하려고 없이 (it + 1)! = values.end())

오류 : 이진 표현식에 잘못된 피연산자 ('std :: _ 1 :: _tree_const_iterator *, long> '및'int ') values.insert (* it/* (it + 1));

버전

컴파일러 : 나는 더러운 해결책을 발견 POSIX

: 애플 LLVM 버전 5.0 (그 소리-500.2.79) (LLVM의 3.3svn 기준) 대상 : x86_64에-사과 darwin13.1.0 스레드 모델 : (자동 it2 = ++ it; - it) 작동하지만, 이것은 정말로 더러운 ...

누군가 설명해 주시겠습니까? std :: set가 잘못 되었습니까?

감사합니다.

+4

그것은 양방향 반복기이며 임의 액세스가 아닙니다 –

+2

'auto it2 = it; ++ it2;는 더러운 해결책보다 깨끗합니다. –

답변

12

std::set 반복자는 bidirectional iterators입니다. 이들은 덧셈 연산자를 통한 증가를 지원하지 않습니다. 단계별로 단계적으로 증가 시키거나 std::next 또는 std::advance을 사용해야합니다. 두 가지 모두 뒤에서 동일합니다. 이 조작은 관계없이 O (N)이됩니다.