오늘 할 것은 erase
선언부는 이렇게된다
인자 생각하면 원본을 수정하지 않겠다라는 것임.
반환타입이 iterotor이고
(그러면 일단 원본을 수정하지 않고 뭘 하겠다는 거네?)
표준 라이브러리에서 제공하는 vector로 일단 본다.
push_back 4번 호출하고 iterator생성해주고
vecInt의 erase 호출하는데 인자로 veciter를 넣어주도록 한다.
그러면 100 없어질듯?
erase를 하고 iter로 vecIte의 원본을 받으면
예외처리가 발생한다.
*vecIter가 가르키고있는것은 200인데 꺼내올려면 문제가 발생한다.
이렇게 다시 begin을 받고 다시 받으면 문제가 없음.
erase로 삭제된 다음 요소를 가르키는 iterator를 되돌려주는 것이다.
삭제된 다음요소를 가르키는 그런 iterator를 주겠다라는 것이다.
그래서 이거보면 반환타입이 iterotor인것이다.
인자로 들어온 녀석이 삭제된 곳을 가르키는 iterator이고,
그렇게 삭제를 하고 나면은
(iterator를 다시 생성해서 반환하나?)
그래서 이렇게 받아왔어야된다.
++vecIter를 넣어주면 뭘 가르키냐 이제
int i = *vecITer는 => 300이다.
(뒤에 다 삭제되는 것인가...??)
inner class에서는 자신의 부모 클래스의 private 접근 가능,
but,
부모 클래스?에서는 inner class의 private에 접근이 불가능하다.
=> 친구선언
iterator클래스 내부에 선언 해주도록 하자.
A에서 친구선언하면 A에서는 B의 private접근이 가능하게 하고싶으면
B class에서 friend class CArr로 해주어야
A가 -> B에 접근이 가능하다.
멤버함수로 private에 접근이 가능하도록 열어주어야한다.
C#의 프로퍼티를 사용하는것과 비슷 한듯?
m_pArr이 iterator의 가변배열 주소임.
이게 뭐랑 같아야 하노?
this랑 같아야지 븅신아.
다르면? => 호출한 객체와 iterator가 같지 않은 상황이다.
다른 주소를 가지고있는데 지운다? => ㅄ임?
iter.m_pArr != this가 무슨 말이냐?
그림으로 보면은
erase를 하는 iterator가 다른 가변배열을 가르키고 그곳을 삭제하는 꼴임.
ㅇㅋ?
vecInt, vecInt2 이렇게 같은 vector< int > 이다.
vecInt2의 begin을 iterator로 받아와서 그 iter에 ++하고 erase를 한 것이다.
그냥 말이 안됨.
iterator가 다른 가변배열 쪽 요소를 가르키는 경우
iterator가 end iterator인 경우