U E D R , A S I H C RSS

EffectiveSTL/Iterator

  • λ°˜λ³΅μžλŠ” STL을 μ΄ν•΄ν•˜λŠ”λ°μ— ν•„μˆ˜μ μΈ κ°œλ…μ΄λ‹€.
  • STL이 μ œκ³΅ν•˜λŠ” λ°˜λ³΅μžλŠ” 4가지닀. (iterator, const_iterator, reverse_iterator, const_reverse_iterator)
  • 이 큰μž₯μ—μ„œλŠ” 각 λ°˜λ³΅μžλ“€μ˜ νŠΉμ„±κ³Ό, λ°˜λ³΅μžλΌ νš¨μœ¨μ μœΌλ‘œ μ“°λŠ” 방법을 λ‹€λ£° 것이닀.



1. Item26. Prefer iterator to const_iterator, reverse_iterator, and const_reverst_iterator.

1.1. 각각의 λ°˜λ³΅μžκ°€ 의λΈν•˜λŠ” 것

  • container<T>::iterator, reverse_iterator : T*
  • container<T>::const_iterator, const_reverse_iterator : const T*
  • reverseλŠ” λ’€μ—μ„œλΆ€ν„° μ•žμœΌλ‘œ μˆœνšŒν•¨. μ•„λ‹Œκ±΄ μ•žμ—μ„œλΆ€ν„° λ’€λ‘œ

1.2. iteratorλΌ μ¨μ•Όν•˜λŠ” 이유

  • λŒ€λΆ€λΆ„μ˜ λ©”μ†Œλ“œλ“€μ˜ μΈμžκ°€ iteratorνƒ€μž…μ΄λ‹€.
  • λ‹€λ₯Έ iteratorλ‘œλΆ€ν„° iterator둜 μ•”μ‹œμ μΈ λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.

1.3. κ²°λ‘ 

  • 이런 ν˜Όμž‘ν•¨μ„ κ²ͺκ³  싢지 μ•Šλ‹€λ©΄ κ·Έλƒ₯ λ”΄κ±° 쓰지 말고 iterator μ“°μžλŠ” 것이닀.
  • λ‚΄ 해석이 잘λͺ»λ˜μ§€ μ•Šμ•˜λ‹€λ©΄, const_iteratorλŠ” 말썽의 μ†Œμ§€κ°€ μžˆλŠ” λ„˜μ΄λΌκ³ κΉŒμ§€ ν‘œν˜„ν•˜κ³  μžˆλ‹€.



2. Item27. Use distance and advance to convert a container's const_iterators to iterators.

2.1. μ„œλ‘ 

  • const_iteratorλŠ” 될수 있으면 쓰지 말라고 ν–ˆμ§€λ§Œ, μ–΄μ©”μˆ˜ 없이 써야할 κ²½μš°κ°€ μžˆλ‹€.
  • κ·Έλž˜μ„œ 이번 Itemμ—μ„œλŠ” const_iterator -> iterator둜 λ³€ν™˜ν•˜λŠ” 법을 μ„λͺ…ν•˜κ³  μžˆλ‹€. λ°˜λŒ€μ˜ κ²½μš°λŠ” μ•”μ‹œμ μΈ λ³€ν™˜μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ, 이건 μ•ˆλœλ‹€.
  • λ‹€μŒμ—” C++의 casting에 κ΄€ν•œ 무슨 함좕적인 의λΈκ°€ λ‹΄κΈ΄ 말을 ν•˜κ³  μžˆλŠ”λ°.. μ•„μ‹œλŠ”λΆ„μ€ μ€ κ°€λ₯΄μ³ μ£Όμ„Έμš”. μ΄λŸ°μƒκ°μ„ 가지고 μžˆλŠ”κ²ƒμ— λŒ€ν•΄ λΆ€λ„λŸ¬μ›Œ ν•˜λΌλ„μš”.
    • 원문 : "When all else fails, get a bigger hammer."

2.2. 잘λͺ»λœ 방법듀

~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<μ•ˆλœλ‹€>.

2.3. ν•΄κ²°μ±…

~cpp 
Iter i(d.begin());    // dλŠ” μ–΄λ–€ μ»¨ν…Œμ΄λ„ˆμ˜ μΈμŠ€ν„΄μŠ€λ‹€.
advance(i, distance(i,ci));        // μš”λ ‡κ²Œ ν•˜λ©΄ λœλ‹€.... μΈμ„ μ•Œμ•˜λŠ”λ° 밑에 또 μ•ˆλœλ‹€κ³  μ¨μžˆλ‹€--;
  • μ™œ μ•ˆλ˜λƒλ©΄, distance의 μΈμžλŠ” λ‘˜μž iteratorλ‹€. const_iteratorκ°€ μ•„λ‹ˆλ‹€.

~cpp 
advance(i, distance<CIter>(i,ci));     // μ΄λ ‡κ²Œ ν•˜λ©΄ μ§„μ§œ λœλ‹€.

2.4. μž‘λ‹΄

  • 정말 별걸 λ‹€ μ„λͺ…ν•œλ‹€λŠ” 생각이 λ“ λ‹€. λͺ¨λ₯΄κ³  μžˆμ—ˆμœΌλ©΄ μ•ˆμ“Έ 것듀도, 괜히 λ“€μ‘€μ…” λ‚΄μ„œ 이거 쓰지 말아라 ν•˜λ‹ˆ 였히렀 더 ν—·κ°ˆλ¦°λ‹€λŠ”--;



3. Item28. Understand how to use a reverse_iterator's base iterator

3.1. 예제

~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을 κ°€λ₯΄ν‚¨λ‹€. κ·Έκ±Έ μ§€μš°λ©΄ λœλ‹€.

3.2. μž‘λ‹΄

  • κ·Έλƒ₯ iterator만 μ“°μž..--;



4. Item29. Consider istreambuf_iterators for character-by-characer input.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:10
Processing time 0.0252 sec