반복자가있는 경우 vector<int>::iterator i = vector.begin()
, i++
은 실제 반복기를 아래로 이동합니다. 그런데 왜 왜 반복자 연산자가 복사본을 반환합니까?
i = i + 3
반복자가있는 경우 vector<int>::iterator i = vector.begin()
, i++
은 실제 반복기를 아래로 이동합니다. 그런데 왜 왜 반복자 연산자가 복사본을 반환합니까?
i = i + 3
+
에서 기대할 수있는 자연스러운 동작을 모방합니다. 에서하는 것과 같은 방법 :
int x = 0;
int y = x + 3;
두 번째 줄은 x
을 변경하지 않습니다, 그냥하지만, x++
이x
을 수정하는 것 (3)의 값으로 평가한다.
일반 반복기를 진행하려면 임의 액세스 반복자에서 i += 3
을 수행하고 다른 경우에는 i++
을 수행해야합니다.
그래서 당신은 쓸 수 : 새 복사본을 만들지 않은
j = i + 3;
operator+
경우,는 무엇 을 할 것인가? i
을 수정 하시겠습니까?
operator+
을 사용하면 피연산자 중 하나를 수정할 필요가 없습니다. 즉 새로운 객체가 만들어 져야한다는 뜻입니다. 그냥 같은이 한 경우 :
int a = 5;
int b = a + 3;
당신은 여전히 5.
그것은이 동일하게 기대를하기 때문에 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
을 쓸 수 있습니다.
어떤 대안을 원하십니까? 'i + 3;'i'를 3 번 돌연변이시키는 것? – delnan
왜 바이너리'operator +'가 복사본을 반환합니까? 의미 상으로,'A + B'는 새로운 객체를 반환하고 인수를 수정하지 않은 채로 두어야합니다. – juanchopanza
anology를 더 취하기 위해서, 예를 들어'2 + 3'라고 말하면 어떻게 될까요? '2' 또는'3'을 변경하지 않고'2''와'3''을 변경하지 않고 ('2'와'3'을 변경하기 때문에) 두 인수를 취해 결과 '5'를 만듭니다. 전혀 의미가 없다 ... 만약 당신이 어떻게 든 '2'또는 '3'을 변경했다면 전체 수학적 세계를 망칠 것입니다.) 마찬가지로 '2'를 반복자 또는 다른 변수로 대체하면 논리를 동일하게 유지하고 반복자 또는 변수를 변경하지 않고 대신 결과를 나타내는 새 인스턴스를 반환하는 것이 좋습니다. – Cornstalks