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