1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include<array> #include<iostream> using namespace std; #define Max_Size 10 void print(array<int, Max_Size> Target_Array) { for (auto i : Target_Array) cout << i << " "; cout << endl; } void main() { array<int, Max_Size > Array = { 1,3,5,7,9,11,13,15,17,19 }; print(Array); cout << *(--Array.end()) << endl; // end() : 가장 끝(범위밖)iter반환하기에 --해서 출력 cout << *(--Array.cend()) << endl; // cend() : const형태로 end() iter반환한거 cout << *(--Array.rend()) << endl; // end() : 가장 끝(범위밖)iter반환하기에 --해서 출력 cout << *(--Array.crend()) << endl; // cend() : const형태로 end() iter반환한거 } | cs |
뭐좀 확인한다고 해보고있는데
end()의경우 컨테이너의 가장마지막(데이터범위밖 뒤쪽) 을 가르키는거잖아?
그러니까 19를 출력하려면 -- 해서 그앞쪽값을 가르키게해서 출력한것이고
rend()의경우는 거꾸로 end()의 위치니까 1의 앞쪽을 가르키고있는것 아님?
그래서 출력하려면 ++Array.rend() 해야지 출력할수 있을 줄 알았는데
--Array.rend()해야 1을 출력하고
Array.rend(), ++Array.rend() 따위는 다 에러를뱉는데
왜??
디폴트 순차 접근 값이 ->이라 그래.. reverse_iterator 반복자 말하는거지?
reverse_iterator<array<int, Max_Size >::iterator> riter<v.end()>; 한다음에 riter로 -- 해봐
요약하자면 역으로 진행하는건 반복자가 그렇게 하는거지.. --, ++ 일반 주소 연산은 원래대로 주소 값에서 빼는거라 상관 없음...
리버스 반복자의 경우 뒤에서부터 시작하고, 진행방향이 앞쪽로 가는것이다? ++ -- 연산또한 그래서 그거에맞춰서 바뀐거고?
뭐 이것저것해보면서 출력해보면 그렇게 보이니 그런게 맞겠지 ㅋㅋ
end()로 반환된 iterator에 바로 --붙이는거보다는 *std::prev(std::end(Array)) 가 더 낫다
rend() 반복자 때문에 나온 멤버함수잔아. rend() 자체는 반복자 끝 위치만 가리키는거 뿐 그 이상 그 이하도 아님. -- ++ 연산을 하면 일반 array에 operator되있는 --,++가 오버로딩됨. 근데 반복자로 할 경우는 operator가 반대로 되게 되있는 거구.
리버스 이터레이터는
http://en.cppreference.com/w/cpp/iterator/reverse_iterator
여기 그림 보면 이해될 듯?
for (auto i : Target_Array) 이게 무슨뜻입니까
ㄴc++11에추가된 문법 for(int i = 0 ; i<10 ; num++) 같은문장을 for(auto i(이터레이터 auto로 자동형변환) : 컨테이너) 해서 돌리는것임
http://lgstar.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다. - DCW