- λ°λ³΅μλ STLμ μ΄ν΄νλλ°μ νμμ μΈ κ°λ
μ΄λ€.
- STLμ΄ μ 곡νλ λ°λ³΅μλ 4κ°μ§λ€. (iterator, const_iterator, reverse_iterator, const_reverse_iterator)
- μ΄ ν°μ₯μμλ κ° λ°λ³΅μλ€μ νΉμ±κ³Ό, λ°λ³΅μλ₯Ό ν¨μ¨μ μΌλ‘ μ°λ λ°©λ²μ λ€λ£° κ²μ΄λ€.
Contents
- 1. Item26. Prefer iterator to const_iterator, reverse_iterator, and const_reverst_iterator.
- 2. Item27. Use distance and advance to convert a container's const_iterators to iterators.
- 3. Item28. Understand how to use a reverse_iterator's base iterator
- 4. Item29. Consider istreambuf_iterators for character-by-characer input.
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.1. μλ‘ ¶
- const_iteratorλ λ μ μμΌλ©΄ μ°μ§ λ§λΌκ³ νμ§λ§, μ΄μ©μ μμ΄ μ¨μΌν κ²½μ°κ° μλ€.
- κ·Έλμ μ΄λ² Itemμμλ const_iterator -> iteratorλ‘ λ³ννλ λ²μ μ€λͺ
νκ³ μλ€. λ°λμ κ²½μ°λ μμμ μΈ λ³νμ΄ κ°λ₯νμ§λ§, μ΄κ±΄ μλλ€.
- λ€μμ C++μ castingμ κ΄ν λ¬΄μ¨ ν¨μΆμ μΈ μλ―Έκ° λ΄κΈ΄ λ§μ νκ³ μλλ°.. μμλλΆμ μ’ κ°λ₯΄μ³ μ£ΌμΈμ. μ΄λ°μκ°μ κ°μ§κ³ μλκ²μ λν΄ λΆλλ¬μ νλΌλ€μ.
- μλ¬Έ : "When all else fails, get a bigger hammer."
- μλ¬Έ : "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<>κ° ν΅νλ€. (μμ ν΄λμ€κ° μλλ€.)
- vector<T>::iteratorλ T*μ typedef, vector<T>::const_iteratorλ const T*μ typedefμ΄λ€. (ν΄λμ€κ° μλλ€.)
- νμ§λ§ 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.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μ κ°λ₯΄ν¨λ€. κ·Έκ±Έ μ§μ°λ©΄ λλ€.