* 반복ìžëŠ” STLì„ ì´í•´í•˜ëŠ”ë°ì— 필수ì ì¸ ê°œë…ì´ë‹¤. * STLì´ ì œê³µí•˜ëŠ” 반복ìžëŠ” 4가지다. (iterator, const_iterator, reverse_iterator, const_reverse_iterator) * ì´ í°ìž¥ì—서는 ê° ë°˜ë³µìžë“¤ì˜ 특성과, 반복ìžë¥¼ 효율ì 으로 쓰는 ë°©ë²•ì„ ë‹¤ë£° 것ì´ë‹¤. [[TableOfContents]] = Item26. Prefer iterator to const_iterator, reverse_iterator, and const_reverst_iterator. = == ê°ê°ì˜ 반복ìžê°€ ì˜ë¯¸í•˜ëŠ” 것 == * container<T>::iterator, reverse_iterator : T* * container<T>::const_iterator, const_reverse_iterator : const T* * reverse는 ë’¤ì—서부터 앞으로 순회함. 아닌건 앞ì—서부터 뒤로 == iterator를 ì¨ì•¼í•˜ëŠ” ì´ìœ == * ëŒ€ë¶€ë¶„ì˜ ë©”ì†Œë“œë“¤ì˜ ì¸ìžê°€ iterator타입ì´ë‹¤. * 다른 iterator로부터 iterator로 암시ì ì¸ ë³€í™˜ì´ ê°€ëŠ¥í•˜ë‹¤. == ê²°ë¡ == * ì´ëŸ° í˜¼ìž¡í•¨ì„ ê²ªê³ ì‹¶ì§€ 않다면 그냥 ë”´ê±° ì“°ì§€ ë§ê³ iterator ì“°ìžëŠ” 것ì´ë‹¤. * ë‚´ í•´ì„ì´ ìž˜ëª»ë˜ì§€ 않았다면, const_iterator는 ë§ì½ì˜ 소지가 있는 넘ì´ë¼ê³ 까지 í‘œí˜„í•˜ê³ ìžˆë‹¤. ---- = Item27. Use distance and advance to convert a container's const_iterators to iterators. = == ì„œë¡ == * const_iterator는 ë 수 있으면 ì“°ì§€ ë§ë¼ê³ 했지만, 어쩔수 ì—†ì´ ì¨ì•¼í• 경우가 있다. * 그래서 ì´ë²ˆ Itemì—서는 const_iterator -> iterator로 변환하는 ë²•ì„ ì„¤ëª…í•˜ê³ ìžˆë‹¤. ë°˜ëŒ€ì˜ ê²½ìš°ëŠ” 암시ì ì¸ ë³€í™˜ì´ ê°€ëŠ¥í•˜ì§€ë§Œ, ì´ê±´ 안ëœë‹¤. * 다ìŒì—” C++ì˜ castingì— ê´€í•œ 무슨 함축ì ì¸ ì˜ë¯¸ê°€ 담긴 ë§ì„ í•˜ê³ ìžˆëŠ”ë°.. ì•„ì‹œëŠ”ë¶„ì€ ì¢€ ê°€ë¥´ì³ ì£¼ì„¸ìš”. ì´ëŸ°ìƒê°ì„ ê°€ì§€ê³ ìžˆëŠ”ê²ƒì— ëŒ€í•´ ë¶€ë„러워 하ë¼ë„¤ìš”. * ì›ë¬¸ : '''"When all else fails, get a bigger hammer."''' == ìž˜ëª»ëœ ë°©ë²•ë“¤ == {{{~cpp // iterator와 const_iterator를 ê°ê° Iter, CIter로 typedefí•´ë†“ì•˜ë‹¤ê³ í•˜ìž. CIter ci; ... Iter i(ci); // 안ëœë‹¤. 암시ì ì¸ í˜•ë³€í™˜ì€ ì„±ë¦½í•˜ì§€ 않는다. ... Iter i( const_cast<Iter>(ci) ) // ì—시 안ëœë‹¤. vector와 stringì—서는 ë ì§€ë„ ëª¨ë¥´ì§€ë§Œ... 별루 추천하지는 않는것 같다. }}} * ë°‘ì—께 안ë˜ëŠ” ì´ìœ 는 iterator와 const_iterator는 다른 í´ëž˜ìФì´ë‹¤. ìƒì†ê´€ê³„ë„ ì•„ë‹Œ í´ëž˜ìŠ¤ê°€ 형변환 ë 리가 없다. * string, vectorê°€ ë ìˆ˜ë„ ìžˆëŠ” ì´ìœ * vector<T>::iterator는 T*ì˜ typedef, vector<T>::const_iterator는 const T*ì˜ typedefì´ë‹¤. (í´ëž˜ìŠ¤ê°€ 아니다.) * string::iterator는 char*ì˜ typedef, string::const_iterator는 const char*ì˜ typedefì´ë‹¤. ë”°ë¼ì„œ const_cast<>ê°€ 통한다. (ì—시 í´ëž˜ìŠ¤ê°€ 아니다.) * 하지만 reverse_iterator와 const_reverse_iterator는 typedefì´ ì•„ë‹Œ í´ëž˜ìФì´ë‹¤. const_cast<안ëœë‹¤>. == í•´ê²°ì±… == {{{~cpp Iter i(d.begin()); // d는 ì–´ë–¤ 컨테ì´ë„ˆì˜ ì¸ìŠ¤í„´ìŠ¤ë‹¤. advance(i, distance(i,ci)); // ìš”ë ‡ê²Œ 하면 ëœë‹¤.... ì¸ì¤„ ì•Œì•˜ëŠ”ë° ë°‘ì— ë˜ ì•ˆëœë‹¤ê³ ì¨ìžˆë‹¤--; }}} * 왜 안ë˜ëƒë©´, distanceì˜ ì¸ìžëŠ” ë‘˜ìž iterator다. const_iteratorê°€ 아니다. {{{~cpp advance(i, distance<CIter>(i,ci)); // ì´ë ‡ê²Œ 하면 ì§„ì§œ ëœë‹¤. }}} == 잡담 == * ì •ë§ ë³„ê±¸ 다 설명한다는 ìƒê°ì´ ë“ ë‹¤. ëª¨ë¥´ê³ ìžˆì—ˆìœ¼ë©´ 안쓸 것들ë„, 괜히 들쑤셔 내서 ì´ê±° ì“°ì§€ ë§ì•„ë¼ í•˜ë‹ˆ ì˜¤ížˆë ¤ ë” í—·ê°ˆë¦°ë‹¤ëŠ”--; ---- = Item28. Understand how to use a reverse_iterator's base iterator = == ì˜ˆì œ == {{{~cpp vector<int> v; ... // vì— ì°¨ë¡€ëŒ€ë¡œ 1~5까지 집어넣는다. typedef vector<int>::reverse_iterator VIRI; VIRI ri = find(v.rbegin(), v.rend(), 3); // 거꾸로 순회하면서 3ì„ ì°¾ëŠ”ë‹¤. typedef vector<int>::iterator VIIT; VIIT i(ri.base()); // 앞ì—ì„œë„ ë§í–ˆì§€ë§Œ reverse ì‹œë¦¬ì¦ˆì˜ base()메소드를 호출해주면 그냥 시리즈로 ë°”ë€ ë°˜ë³µìžë¥¼ 리턴해준다. }}} || rend() || || || ri || || rbegin() || || || || 1 || 2 || 3 || 4 || 5 || || || || begin() || || || i || || end() || * 어째 ê·¸ë¦¼ì´ ì¢€ ì´ìƒí•˜ê¸´ 한ë°..--; ê°ê°ì˜ 반복ìžê°€ 가르키는 위치를 나타낸 것ì´ë‹¤. ë³´ë©´ ì•Œê² ì§€ë§Œ riì—서 base()를 호출해줬는ë°ë„ 가르키는게 같지가 않다. * ê²°ë¡ ë¶€í„° ë§í•˜ìžë©´, base()메소드가 ì›í•˜ëŠ” 반복ìžë¥¼ 리턴해주는건 아니다. ì‚½ìž…í• ë–„ëŠ” ë˜ì§€ë§Œ, ì›ì†Œë¥¼ 지울때는 꼬ì¸ë‹¤. * ë§Œì•½ì— riê°€ 가르키는 위치ì—다 새로운 ì›ì†Œë¥¼ ì‚½ìž…í•˜ê³ ì‹¶ë‹¤ê³ í•˜ìž. 하지만 insert 메소드는 reverse_iterator는 ì¸ìžë¡œ 받지 않는다. iterator형만 ì¸ìžë¡œ 받는다. 즉 ì§ì ‘ì€ ëª»í•œë‹¤ëŠ” 것ì´ë‹¤. ì§€ìš¸ë•Œë„ ì´ì™€ ê°™ì€ ë¬¸ì œê°€ ë°œìƒí•œë‹¤. 그래서 base()를 쓰는 것ì´ë‹¤. * 99를 iê°€ 가르키는 ìœ„ì¹˜ì— ì‚½ìž…í–ˆë‹¤ê³ í•˜ë©´(reverse시리즈는 ì¸ìžë¡œ 못 넣는다.) ì´ë ‡ê²Œ ë 것ì´ë‹¤. || 1 || 2 || 3 || 99 || 4 || 5 || * ì‚½ìž…ì€ ë¬¸ì œì—†ì´ ë˜ì—ˆì§€ë§Œ.. ë§Œì•½ì— erase()를 호출한다면? 난 3ì„ ì§€ìš°ê³ ì‹¶ì€ë° base()호출해서 iteratorë²„ì ¼ìœ¼ë¡œ 넣어주면 4ê°€ ë‚ ì•„ê°ˆ 것ì´ë‹¤. 어떻게 해야하는가? * í•´ê²°ì±…ì€ {{{~cpp v.erase( (++ri).base() ); // ë. ì´ëŸ¬ë©´ ri는 2를 가르키게 ë˜ê³ base() 호출후 리턴ë˜ëŠ” 반복ìžëŠ” 3ì„ ê°€ë¥´í‚¨ë‹¤. 그걸 지우면 ëœë‹¤. }}} == 잡담 == * 그냥 iteratorë§Œ ì“°ìž..--; ---- = Item29. Consider istreambuf_iterators for character-by-characer input. = ---- ["EffectiveSTL"]