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.0207 sec