2012-12-08 3 views
3

반복자가있는 경우 vector<int>::iterator i = vector.begin(), i++은 실제 반복기를 아래로 이동합니다. 그런데 왜 왜 반복자 연산자가 복사본을 반환합니까?

i = i + 3

같은 세 개의 문 아래로 당신에게 새로운 반복자를 제공합니까?

+1

어떤 대안을 원하십니까? 'i + 3;'i'를 3 번 ​​돌연변이시키는 것? – delnan

+0

왜 바이너리'operator +'가 복사본을 반환합니까? 의미 상으로,'A + B'는 새로운 객체를 반환하고 인수를 수정하지 않은 채로 두어야합니다. – juanchopanza

+0

anology를 더 취하기 위해서, 예를 들어'2 + 3'라고 말하면 어떻게 될까요? '2' 또는'3'을 변경하지 않고'2''와'3''을 변경하지 않고 ('2'와'3'을 변경하기 때문에) 두 인수를 취해 결과 '5'를 만듭니다. 전혀 의미가 없다 ... 만약 당신이 어떻게 든 '2'또는 '3'을 변경했다면 전체 수학적 세계를 망칠 것입니다.) 마찬가지로 '2'를 반복자 또는 다른 변수로 대체하면 논리를 동일하게 유지하고 반복자 또는 변수를 변경하지 않고 대신 결과를 나타내는 새 인스턴스를 반환하는 것이 좋습니다. – Cornstalks

답변

5

+에서 기대할 수있는 자연스러운 동작을 모방합니다. 에서하는 것과 같은 방법 :

int x = 0; 
int y = x + 3; 

두 번째 줄은 x을 변경하지 않습니다, 그냥하지만, x++x을 수정하는 것 (3)의 값으로 평가한다.

일반 반복기를 진행하려면 임의 액세스 반복자에서 i += 3을 수행하고 다른 경우에는 i++을 수행해야합니다.

1

그래서 당신은 쓸 수 : 새 복사본을 만들지 않은

j = i + 3; 

operator+ 경우,는 무엇 을 할 것인가? i을 수정 하시겠습니까?

4

operator+을 사용하면 피연산자 중 하나를 수정할 필요가 없습니다. 즉 새로운 객체가 만들어 져야한다는 뜻입니다. 그냥 같은이 한 경우 :

int a = 5; 
int b = a + 3; 

당신은 여전히 ​​5.

1

그것은이 동일하게 기대를하기 때문에 x + n해야 하지 변화에 관계없이 x이 무엇인지, 그 여부의 x의 값 int 또는 iterator입니다. 아이디어는 동일합니다.

다음 대안을 가지고
it = it + 3; 

, 당신이 쓸 수있다 : 당신이 쓰고 싶지 않는 경우

std::advance(it, 3); 

참고가 할 몇 가지 표준 컨테이너의 경우 지원하지 않음 임의 액세스 반복자 , it = it + 3이 아니지만 여전히 std::advance(it,3) 쓸 수 있습니다. 예를 들어 :

std::list<int>::iterator it = lst.begin(); 

it = it + 3; //COMPILATION ERROR. `it` is not random access iterator 

std::advance(it,3); //okay 

그래서 이러한 경우에, std::advance(it,3) 유일한 방법 (또는 다른 당신은 이러한 기능 직접 작성했습니다)을.

1. std::vector<T>::iterator은 임의 액세스 반복기이므로, it+3을 쓸 수 있습니다.

관련 문제