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