U E D R , A S I H C RSS

EffectiveSTL/Container

  • STL์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.(Iterator, Generic Algorithm, Container ๋“ฑ๋“ฑ). ์—ญ์‹œ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ด๊ณ , ์กฐ๊ธˆ๋งŒ ์•Œ์•„๋„ ์“ธ์ˆ˜ ์žˆ๊ณ , ํŽธํ•˜๊ฒŒ ์“ธ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ Container๋‹ค. Container๋Š” Vector, List, Deque ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ทธ๋ฆ‡๊ณผ ๊ฐ™์€ Object๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
  • STL์˜ Container๋“ค์˜ ์žฅ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ์—ญ์‹œ ์œ ์—ฐ์„ฑ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์•Œ์•„์„œ ํ•˜๊ธฐ, ์ž์‹ ์ด ์•Œ์•„์„œ ๋Š˜์—ˆ๋‹ค ์ฆ์—ˆ๋‹ค ํ•˜๊ธฐ ๋“ฑ๋“ฑ์ด ์žˆ๊ฒ ๋‹ค. ๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ด๊ฑฐ๋‚˜ ์ €๊ฑฐ๋‚˜ ๋น„์Šท๋น„์Šทํ•ด์„œ ํ•˜๋‚˜๋งŒ ๊ณต๋ถ€ํ•˜๋ฉด, ์‰ฝ๊ฒŒ ๋‹ค๋ฅธ๊ฒƒ๋„ ์“ธ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ๋˜ ํ•˜๋‚˜์˜ ์žฅ์ ์ด ๋ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
  • ํฐ 1์žฅ Containers์—์„œ๋Š” ์ƒํ™ฉ์— ๋งž๋Š” ์ ์ ˆํ•œ Container ๊ณ ๋ฅด๋Š” ๋ฒ•, ํšจ์œจ์„ฑ ๊ทน๋Œ€ํ™” ํ•˜๊ธฐ ๋“ฑ๋“ฑ์„ ๋‹ค๋ฃฌ๋‹ค.

Contents

1. Item1. Choose your containers with care.
1.1. STL์ด ์ง€์›ํ•˜๋Š” Containers
1.2. vector, deque, list ๊ณ ๋ฅด๋Š” ํŒ
1.3. Contiguous-memory Containers & Node-based Containers
1.4. STL Container ๊ณ ๋ฅด๋Š” ํŒ
2. Item2. Beware the illusion of container-independant code.
2.1. ์™„๋ฒฝํ•œ Container ๋…๋ฆฝ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์€ ๋ถˆ๊ฐ€๋Šฅ?
2.2. ๊ทธ๋‚˜๋งˆ ๊ณ ์น˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋Š” ํŒ๋“ค
3. Item3. Make copying cheap and correct for objects in containers.
3.1. STL way
3.2. ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ๋„ฃ์„๋•Œ์˜ ๋ฌธ์ œ์ 
3.3. ํ•ด๊ฒฐ์ฑ…
3.4. Why copy?
4. Item4. Call empty instead of checking size() against zero.
5. Item5. Prefer range member functions to their single-element counterparts.
5.1. a ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๋‚ด์šฉ์˜ ๋’ท๋ถ€๋ถ„์˜ ์ ˆ๋ฐ˜์„ b๋ผ๋Š” ๋ฒกํ„ฐ ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
6. Item6. Be alery for c++'s most vexing parse
6.1. ๋ฌธ์ œ์ ?
6.2. ์˜ˆ์ œ : ints.dat ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ •์ˆ˜๋“ค์„ ์ฝ์–ด์„œ list<int> data์— ์“ฐ๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.
6.3. ํ•ด๊ฒฐ์ฑ…
6.4. ์žก๋‹ด
7. Item7. When using containers of newed pointers, remember to delete the pointers before the container is destroyed
7.1. ์„œ๋ก 
7.2. ์˜ˆ์ œ
7.3. ๋ณด์™„๋ฒ• 1(class for function object)
7.4. ๋ณด์™„๋ฒ• 2(Smart Pointer)
8. Item8. Never create containers of auto_ptrs.
9. Item9. Choose carefully among erasing options.
9.1. ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ int๊ฐ’๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ฑฐ๊ธฐ์„œ 1982 ๋ผ๋Š” ์ˆซ์ž๋ฅผ ๋ชฝ๋•… ์ง€์›Œ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด?
9.2. ์กฐ๊ฑด ๊ฒ€์‚ฌํ•ด์„œ ๋ชฝ๋•… ์ง€์›Œ์ฃผ๊ธฐ
9.2.1. ์‰ฝ๊ฒŒ ํ• ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค
9.2.2. Associative Container ์ผ๋•Œ
9.3. ์žก๋‹ด
10. Item10. Be aware of allocator conventions and restrictions.
11. Item11. Understand the legitimte uses of custom allocators.
12. Item12. Have realistic expectations about the thread safety of STL containers.


1. Item1. Choose your containers with care.

1.1. STL์ด ์ง€์›ํ•˜๋Š” Containers

  • Sequence Containers - vector, deque, list, string( vector<char> ) ๋“ฑ๋“ฑ
  • Associative Containers - set, multiset, map, multimap ๋“ฑ๋“ฑ
  • ๊ทธ ์™ธ์— Non Standard๋ผ๊ณ  ์จ์žˆ๋Š”๊ฒŒ ์žˆ๊ธด ํ•œ๋ฐ, ์ž˜ ์•ˆ์“ฐ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ํ˜น์‹œ๋ผ๋„ ๋‚˜์ค‘์— ์ค‘์š”์„ฑ์ด ๋ถ€๊ฐ๋˜๋ฉด ๋‹ค์‹œ ๋ด์•ผ๊ฒ ๋‹ค. ๋”ด๊ฒŒ ๊ธ‰ํ•˜๋‹ˆ ์ผ๋‹จ.. AfterCheck
  • vector๊ฐ€ ์ข‹๋‹ค๊ณ  ์จ์žˆ๋‹ค. ์ž˜ ์“ฐ์ž. ๊ฐ€๋”๊ฐ€๋‹ค ์‹œ๊ฐ„,์ €์žฅ๊ณต๊ฐ„ ๋“ฑ๋“ฑ์— ์žˆ์–ด์„œ Associative Containers๋ฅผ ์••๋„ํ• ๋•Œ๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
    • vector ๋Š” Sequence Container ๋‹ˆ๊นŒ ๋ณดํ†ต Associative Container ๋“ค(์ฃผ๋กœ Map)๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋‚ญ๋น„๊ฐ€ ๋œํ•จ. ๊ทธ๋Œ€์‹  ํ•˜๋‚˜ ๋‹จ์œ„ ๊ฒ€์ƒ‰์„ ํ• ๋•Œ์—๋Š” Associative Container ๋“ค์ด ๋” ๋น ๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ. (์˜ˆ๋ฅผ ๋“ค์–ด ์ „ํ™”๋ฒˆํ˜ธ๋“ค์„ ์ €์žฅํ•œ container ์—์„œ 024878113 ์„ ์ฐพ๋Š”๋‹ค๋ฉด.? map ์˜ ๊ฒฝ์šฐ๋Š” ๋ฐ”๋กœ ํ•ด์‰ฌํ•จ์ˆ˜๋ฅผ ์ด์šฉ, ํ•œํ์— ์ฐพ์ง€๋งŒ, Sequence Container ๋“ค์˜ ๊ฒฝ์šฐ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ขŒ์•… ๊ฒ€์ƒ‰ํ•˜๊ฒ ์ง€.) --1002

1.2. vector, deque, list ๊ณ ๋ฅด๋Š” ํŒ

  • vector๋Š” ๋ฌด๋‚œํ•˜๊ฒŒ ์“ฐ๊ณ  ์‹ถ์„๋•Œ
  • list๋Š” ์ค‘๊ฐ„์—์„œ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ์ž์ฃผ ์ผ์–ด๋‚ ๋•Œ
  • deque๋Š” ์ข…๋‹จ์ (์‹œ์ž‘๊ณผ ๋)์—์„œ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ์ž์ฃผ ์ผ์–ด๋‚ ๋•Œ

1.3. Contiguous-memory Containers & Node-based Containers

  • ์ „์ž๋Š” ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Container(์ฆ‰, ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ• ๋•Œ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋“ค์ด ์—ฐ์†์ ์ด ๋œ๋‹ค), ํ›„์ž๋Š” ๋…ธ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Container(๋…ธ๋“œ์˜ ๊ฒฝ์šฐ๋Š” ๋ฐ˜๋“œ์‹œ ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค.)๋‹ค. ๋…ธ๋“œ๊ฐ€ ๋ญ”์ง€๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์งœ๋ณด๋ฉด ์•Œ๊ฒŒ ๋œ๋‹ค.
  • ์ „์ž์—๋Š” vector, string, deque ๋“ฑ์ด ์žˆ๋‹ค. ๋ญ”๊ฐ€ ๋˜ ๋ณต์žกํ•œ ๋ง์ด ์žˆ๊ธด ํ•œ๋ฐ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์ž. ๋Œ€์ถฉ insert, delete๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๊ธฐ์กด์˜ ์›์†Œ๊ฐ€ ์ด๋™ํ•œ๋‹ค๋Š” ๋ง ๊ฐ™๋‹ค.
  • ํ›„์ž์—๋Š” list ๋“ฑ์ด ์žˆ๋‹ค. ๋…ธ๋“œ๋Š” ๊ทธ๋ƒฅ ํฌ์ธํ„ฐ๋งŒ ๋ฐ”๊ฟ” ์ฃผ๋ฉด insert, delete๊ฐ€ ์ž์œ ์ž์žฌ๋กœ ๋œ๋‹ค๋Š”๊ฑฐ ๋‹ค ์•Œ๊ฒƒ์ด๋‹ค.

1.4. STL Container ๊ณ ๋ฅด๋Š” ํŒ

  • ์–‘๋์—์„œ insert, delete ํ•˜๋ ค๋ฉด? Associative Containers๋Š” ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค.
  • Random Access Iterator(์ž„์˜ ์ ‘๊ทผ ๋ฐ˜๋ณต์ž)๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, vector, deque, string ์จ์•ผ ํ•œ๋‹ค. (rope๋ž€๊ฒƒ๋„ ์žˆ๋„ค), Bidirectional Iterator(์–‘๋ฐฉํ–ฅ ๋ฐ˜๋ณต์ž)๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, slist๋Š” ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค.(๋‹น์—ฐํ•˜๊ฒ ์ง€) Hashed Containers ๋˜ ์“ฐ์ง€ ๋ง๋žœ๋‹ค.
  • Insert, Delete ํ• ๋•Œ ์›์†Œ์˜ ์ธ๋ฑ์Šค ์œ„์น˜๊ฐ€ ๋ณ€ํ•˜๋ฉด ์•ˆ๋œ๋‹ค? ๊ทธ๋Ÿฌ๋ฉด Contiguous-memory Containers๋Š” ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค. (ํ•ด๋‹น ์›์†Œ์˜ ์ธ๋ฑ์Šค ์œ„์น˜๊ฐ€ ๋ณ€ํ•œ๋‹ค.)
  • Search ์†๋„๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋ฉด Hashed Containers, Sorted Vector, Associative Containers๋ฅผ ์“ด๋‹ค. (๋ฐ”๋กœ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผ, ์ƒ์ˆ˜ ๊ฒ€์ƒ‰์†๋„)
  • Insert, Delete๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์“ฐ๋ ค๋ฉด, Node Based Containers๋ฅผ ์“ฐ์ž.
  • Iterator, Pointer, Reference ๊ฐฑ์‹ ์„ ์ตœ์†Œํ™” ํ•˜๋ ค๋ฉด Node Based Containers๋ฅผ ์“ด๋‹ค.



2. Item2. Beware the illusion of container-independant code.

2.1. ์™„๋ฒฝํ•œ Container ๋…๋ฆฝ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์€ ๋ถˆ๊ฐ€๋Šฅ?

  • Standard Contiguois-memory Container๋“ค์€ ์ž„์˜์ ‘๊ทผ ์—ฐ์‚ฐ์ž []์„ ์ง€์›ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ๊ฑด ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Standard Node-based Container๋“ค์€ ์–‘๋ฐฉํ–ฅ ๋ฐ˜๋ณต์ž(bidirectional Iterator)๋ฅผ ์ง€์›ํ•œ๋‹ค.
  • ๊ฒฐ๊ตญ ์ด ์ฝ”๋“œ์—์„œ ์ด ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž‘๋™ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ผ๋Š”๋ฐ, ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ™์€ ๊ณ„์—ด์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ์„ฑํ–ฅ์ด ๋‹ค๋ฅธ๊ฑธ๋กœ ๋ฐ”๊พธ๋ฉด--; ๋งŽ์ด ๊ณ ์ณ์•ผ ํ• ๊ฒƒ์ด๋‹ค.
  • ๊ฐ๊ฐ์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ์žฅ์ ๊ณผ ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ณ ๋ฅด๋Š” ๋Šฅ๋ ฅ์„ ๊ธฐ๋ฅด์ž.
    STL Tutorial and Refereince ๋ฅผ ๋ณด๋ฉด, ์ผ๋ถ€๋Ÿฌ ํ•ด๋‹น Container ์—๊ฒŒ ์ตœ์ ํ™”๋œ ๋ฉ”์†Œ๋“œ๋“ค๋งŒ ์ง€์›ํ•œ๋‹ค๊ณ  ์จ์žˆ์—ˆ๋˜ ๊ธฐ์–ต. ์˜ˆ๋ฅผ ๋“ ๋‹ค๋ฉด, Vector ์˜ ๊ฒฝ์šฐ push_front ๊ฐ™์€ ๊ฒƒ์ด ์—†๋‹ค. (๋งŒ์ผ vector์— push_front ๋ฅผ ํ•œ๋‹ค๋ฉด? push_front ๋ ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๊ธฐ์กด์˜ ์›์†Œ๋“ค ์œ„์น˜๊ฐ€ ๋ฐ”๋€๋‹ค.) --1002

2.2. ๊ทธ๋‚˜๋งˆ ๊ณ ์น˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋Š” ํŒ๋“ค

  • typedef์„ ์“ฐ์ž.

~cpp 
vector<Type>::itarator // typedef vector<Type>::iterator VTIT ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ”๊ฟ€์ˆ˜ ์žˆ๋‹ค. ์•ž์œผ๋กœ๋Š” ์ €๋ ‡๊ฒŒ ๊ธธ๊ฒŒ ์“ฐ์ง€ ์•Š๊ณ ๋„ VIIT ์ด๋ ‡๊ฒŒ ์“ธ์ˆ˜ ์žˆ๋‹ค.
  • Encapsulization์„ ์ž˜ ํ•˜์ž. ๋ฐ”๋€Œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ถฉ๊ฒฉ์ด ์ค„์–ด๋“ค ๊ฒƒ์ด๋‹ค.



3. Item3. Make copying cheap and correct for objects in containers.

3.1. STL way

  • ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ์„ ๋•Œ๋‚˜ ๋บ„ ๋•Œ, ๋ณต์‚ฌ๋ฅผ ํ•œ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ์— Object๋ฅผ ๋„ฃ์„๋•Œ์—๋Š”, ๊ทธ Object์˜ ๋ณต์‚ฌ ์ƒ์„ฑ์ž(const reference)์™€, ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋ฅผ ์žฌ์ •์˜(const reference) ํ•ด์ฃผ์ž. ์•ˆ๊ทธ๋Ÿฌ๋ฉด ๋ณต์‚ฌ๋กœ ์ธํ•œ ์—„์ฒญ๋‚œ ๋‚ญ๋น„๋ฅผ ๋ณด๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค.

3.2. ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ๋„ฃ์„๋•Œ์˜ ๋ฌธ์ œ์ 

  • Slicing์—๋Ÿฌ

~cpp 
vector<Widget> vw;

class SpecialWidget : public Widget ...

SpecialWidget sw;

vw.push_back(sw) // ์–ด๋–ป๊ฒŒ ๋ ๊นŒ. ๋ณต์‚ฌ๋˜๋ฉด์„œ SpecialWidget๋งŒ์˜ ํŠน์ˆ˜์„ฑ์€ ์ œ๊ฑฐ๋˜๊ณ , Widget์˜ ํŠน์„ฑ๋งŒ ๋‚จ๊ฒŒ ๋œ๋‹ค.
  • ํ•ด๊ฒฐ์ฑ…์œผ๋ก  ๊ฐ€์ƒํ•จ์ˆ˜ ๋“ฑ๋“ฑ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

3.3. ํ•ด๊ฒฐ์ฑ…

  • ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ’์„ ๋„ฃ์ง€ ๋ง๊ณ , ํฌ์ธํ„ฐ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.

~cpp 
vector<Widget*> vw;
vw.push_back(new SpecialWidget); // ์ž˜๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ ์—ญ์‹œ ๋‚ด๊ฐ€ deleteํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋Œ€์•ˆ์œผ๋กœ smart pointers๋ผ๋Š”๊ฒŒ ์žˆ๋‹ค.(์ด๊ฒŒ ๋ญ˜๊นŒ)
    MoreEffectiveC++/Techniques1of3 ์˜ Item 28 ์„ ๋ด๋ผ. ์˜๋ฌธ์„ ๋ณด๋Š”๊ฒƒ์ด ๋” ์ข‹์„๊ฒƒ์ด๋‹ค. MoreEffectiveC++ ์˜ ์ „์ž์ฑ…๊ณผ ์•„๋‚ ๋กœ๊ทธ ๋ชจ๋‘๋‹ค ์†Œ์žฅํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ํ•„์š”ํ•˜๋ฉด ๋งํ•˜๊ณ , ๋‚˜๋„ ์ด ์ฑ… ์ •๋ฆฌ ํ• ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ฐธ์—ฌํ•˜๋„๋ก ๋…ธ๋ ฅํ•˜๋งˆ --์ƒ๋ฏผ

3.4. Why copy?

  • ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋””์ž์ธ ๋˜์–ด์žˆ๋‹ค.(์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ„๋‹ค.)
  • ๋‚ด๊ฐ€ ์š”๊ตฌํ• ๋•Œ๋งŒ ๊ทธ๋งŒํผ ๋งŽ์€ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•œ๋‹ค.



4. Item4. Call empty instead of checking size() against zero.

  • ์ปจํ…Œ์ด๋„ˆ์— ํ•˜๋‚˜๋„ ์•ˆ๋“ค์—ˆ๋‹ค๋Š”๊ฒƒ์„ ๊ฐ€์ •ํ• ๋•Œ size() == 0 ์ด๊ฒƒ๋ณด๋‹ค empty() ๊ฐ€ ๋” ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.
  • empty()๋Š” ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•˜๊ณ , size()๋Š” ์„ ํ˜• ์‹œ๊ฐ„์— ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ณ ๋กœ empty() ์“ฐ์ž.



5. Item5. Prefer range member functions to their single-element counterparts.

  • ๋ฒ”์œ„ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๋ฉ”์†Œ๋“œ๋ณด๋‹ค ์šฐ์›”ํ•˜๋‹ค. ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋“ฏํ•˜๋‹ค.

5.1. a ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๋‚ด์šฉ์˜ ๋’ท๋ถ€๋ถ„์˜ ์ ˆ๋ฐ˜์„ b๋ผ๋Š” ๋ฒกํ„ฐ ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

  • STL์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ๊ฒƒ์ด๋‹ค.

~cpp 
// ๋ช…์‹œ์ ์ธ ๋ฐ˜๋ณต๋ฌธ์„ ์“ด๋‹ค.
vector<Object> a,b;

b.clear();

for(vector<Object>::const_itarator VWCI = a.begin() + a.size()/2 ; VWCI != a.end() ; ++VWCI)
	b.push_back(*VWCI)


  • ์•ฝ๊ฐ„ ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด..

~cpp 
// copy ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ๋‹ค.
vector<Object> a,b;

b.clear();
copy( a.begin() + a.size() / 2, a.end(), back_inserter(b)) ;

  • ์–ด๋А ์ •๋„ ์•Œ๊ณ , ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ์ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด..

~cpp 
// assign ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
vector<Object> a,b;

b.assign(a.begin() + a.size() / 2, a.end());

  • ์ด ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ณด์ž. ์ฒซ๋ฒˆ์งธ ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์— ๋ฃจํ”„๊ฐ€ ์–ด๋”จ๋ƒ๊ณ  ๋ฌผ์œผ๋ฉด ๋‚˜๋Š” ๋ชจ๋ฅธ๋‹ค. copy ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‚ด๋ถ€์—์„œ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•œ๋‹จ๋‹ค. ํ•˜์ง€๋งŒ assign ๋ฉ”์†Œ๋“œ๋Š” ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•œ๋ฒˆ์— ์ง ! ํ•ด์ฃผ๋Š”๊ฑฐ ๊ฐ™๋‹ค.

  • copy, push_back ์ด๋Ÿฐ๊ฒƒ์€ ๋„ฃ์–ด์ค„๋•Œ insert iterator๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, ํ•˜๋‚˜ ๋„ฃ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•ด์ฃผ๊ณ , ๊ฐ์ฒด ๋ณต์‚ฌํ•˜๊ณ (ํฐ ๊ฐ์ฒด๋ฉด... --; ๋ฌต๋…), ๋˜ ํ•˜๋‚˜ ๋„ฃ์–ด์ฃผ๊ณ  ์ € ์ง“ํ•˜๊ณ .. ์ด๋Ÿฐ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ assign์€ ๋˜‘๊ฐ™์€ ์ž‘์—…์„ ํ•œ๋ฒˆ์— ์ง ~, ๋งŒ์•ฝ 100๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋„ฃ๋Š”๋‹ค๋ฉด assign์€ copy์ด๋Ÿฐ๊ฒƒ๋ณด๋‹ค 1/100 ๋ฐ–์— ์‹œ๊ฐ„์ด ์•ˆ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.(์ •ํ™•ํ•˜์ง„ ์•Š๊ฒ ์ง€๋งŒ.. ๋ญ ๊ทธ๋Ÿฌํ•˜๋‹ค.)

  • ๋˜ ํ•˜๋‚˜์˜ ๋ฌธ์ œ์ , insert ๋ฉ”์†Œ๋“œ๋Š” ์‹คํ–‰ํ• ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์”ฉ ๋ฐ€๋ฆฐ๋‹ค. ๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ n๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๊ฑฐ๊ธฐ๋‹ค m๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ insert๋กœ ๋„ฃ์œผ๋ฉด.. n*m๋งŒํผ ๋’ค๋กœ ๋•ก๊ธฐ๋А๋ผ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋œ๋‹ค. int๊ฐ™์€ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ด๋ฉด ๊ดœ์ฐฎ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ.. ๋งŒ์•ฝ์— ๊ฐ์ฒด๊ฐ€ ํฐ ๊ฒฝ์šฐ๋ผ๋ฉด, ๋Œ€์ž… ์—ฐ์‚ฐ์ž, ๋ณต์‚ฌ ์ƒ์„ฑ์ž ์ด๋Ÿฐ๊ฒƒ๋„ ์ €๋งŒํผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฏธ์นœ๋‹ค.

  • range ๋ฉค๋ฒ„ ๋ฉ”์†Œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋‘๊ฐœ์˜ ๋ฐ˜๋ณต์ž๋กœ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ํ•œ๋ฒˆ์— ์˜ฎ๊ธฐ๊ณ  ๋„ฃ๋Š”๋‹ค. ๋ฒกํ„ฐ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, ๋งŒ์•ฝ์— ์ฃผ์–ด์ง„ ๊ณต๊ฐ„์ด ๊ฝ‰ ์ฐผ์„๋•Œ, insert๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์ƒˆ๋กœ์šด ๊ณต๊ฐ„ ํ• ๋‹นํ•ด์„œ ์ง€๊ธˆ์˜ ๋‚ด์šฉ๋“ค๊ณผ, ๋„ฃ์œผ๋ ค๋Š” ๊ฒƒ๋“ค์„ ๊ทธ๋ฆฌ๋กœ ์˜ฎ๊ธฐ๊ณ  ์ง€๊ธˆ ์žˆ๋Š”๊ฑธ ์ง€์šฐ๋Š” ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ๋‹ค. ์ด์ง“์„ 100๋ฒˆ ํ•ด๋ณด๋ผ, ์ปดํ“จํ„ฐ๊ฐ€ ์ƒ๋‹นํžˆ ๊ธฐ๋ถ„๋‚˜๋น ํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ํ•˜์ง€๋งŒ range ๋ฉค๋ฒ„ ๋ฉ”์†Œ๋“œ๋Š” ๋ฏธ๋ฆฌ ๋Š˜๋ ค์•ผ ํ•  ํฌ๊ธฐ๋ฅผ ์•Œ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

  • ์„ฑ๋Šฅ ๋”ฐ์ง€๊ธฐ ๊ณจ์น˜ ์•„ํ”ˆ ์‚ฌ๋žŒ์ด๋ผ๋„, range ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ํ•˜๋‚˜์”ฉ ์‹œ๋ฆฌ์ฆˆ๋ณด๋‹ค ํƒ€์ดํ•‘ ์–‘์ด ์ ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒƒ์ด๋‹ค.



  • 6. Item6. Be alery for c++'s most vexing parse

    6.1. ๋ฌธ์ œ์ ?

    • ์•„์ง๊นŒ์ง€๋„ STL์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์žŠ์–ด๋ฒ„๋ฆฌ๊ณ  ์žˆ์—ˆ๋˜ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ๊ด€ํ•œ..

    ~cpp 
    class Widget {...};    // ๋””ํดํŠธ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •
    Widget a               // ๋งž๋‹ค.
    Widget b()             // ๊ณผ์—ฐ?
    
    • Widget b() ์ด๊ฒƒ์€ Widgetํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” b๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋‹ค. ์ด๊ฒƒ๊ณผ ๊ด€๋ จํ•ด ํŒŒ์‹ฑ ์—๋Ÿฌ๊ฐ€ ์ž์ฃผ ์ผ์–ด๋‚œ๋‹ค๊ณ  ํ•œ๋‹ค.

    6.2. ์˜ˆ์ œ : ints.dat ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ •์ˆ˜๋“ค์„ ์ฝ์–ด์„œ list<int> data์— ์“ฐ๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.


    ~cpp 
    ifstream dataFile("ints.dat");
    list<int> data(ifstream_iterator<int>(dataFile),ifstream_iterator<int>());     // ์ด๋Ÿฐ ๋ฐฉ๋ฒ•๋„ ์žˆ๊ตฐ. ๋‚œ ๋งจ๋‚  ๋Œ๋ ค๊ฐ€๋ฉด์„œ ๋„ฃ์—ˆ๋Š”๋ฐ..--;
    

    • ์™ ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‘๋ฒˆ์งธ ๋ฌธ์žฅ์€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์œ„์—์„œ ์ œ๊ธฐํ•œ ๋ฌธ์ œ ๋•Œ๋ฌธ(๊ด„ํ˜ธ์— ๊ด€๋ จ๋œ)์ด๋‹ค. ๋ณ„๋ฃจ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์ง„ ์•Š์œผ๋‹ˆ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ. ๊ทธ๋ž˜๋„ ํ•ด๊ฒฐ์ฑ…์€..

    6.3. ํ•ด๊ฒฐ์ฑ…

    ~cpp 
    ifstream dataFile("ints.dat");
    ifstream_iterator<int> dataBegin(dataFile);
    ifstream_iterator<int> dataEnd;
    
    list<int> data(dataBegin, dataEnd);         // ์š”๋Ÿฐ์‹์œผ๋กœ ์จ์ฃผ์ž.
    

    6.4. ์žก๋‹ด

    • C++์ด ์ด๋ ‡๊ฒŒ ์• ๋งคํ•œ์ค„์€ ๋ชฐ๋ž๋‹ค.
    • STL์—์„œ ๋ฐ˜๋ณต์ž๋กœ ๋Œ๋ฆฌ๋Š”๊ฑด ํ‘œ์ค€ ์Šคํƒ€์ผ์ด๋ž€๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋„๋ก ํ•˜์ž.



    7. Item7. When using containers of newed pointers, remember to delete the pointers before the container is destroyed

    7.1. ์„œ๋ก 

    • ๋ˆ„๋ˆ„ํžˆ ๊ฐ•์กฐํ–ˆ๋˜ new๋กœ ๋งŒ๋“ ๊ฑฐ ๋„ฃ์—ˆ์œผ๋ฉด, delete ํ•ด์ฃผ์ž๋Š” ๊ฒƒ์ด๋‹ค.
    • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํŒŒ๊ดด๋ ๋•Œ ํฌ์ธํ„ฐ๋Š” ์ง€์›Œ์ฃผ๊ฒ ์ง€๋งŒ, ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋Š” destroy๋˜์ง€ ์•Š๋Š”๋‹ค.(Detected Memory Leaks!)

    7.2. ์˜ˆ์ œ

    ~cpp 
    vector<Object*> v;
    
    for(int i = 0 ; i < 10 ; ++i)
    	v.push_back(new Object); // new๋กœ ๋„ฃ์–ด์คฌ๋‹ค.
    
    ...
    ...
    
    for(vector<Object*>::iterator i = v.begin() ; i != v.end() ; ++i)
    	delete *i // ์ง€์›Œ์ฃผ์ž.
    
    return 0;
    

    • ํ•˜์ง€๋งŒ ... ๋ถ€๋ถ„์—์„œ ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์ ธ์„œ ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚˜๋ฒ„๋ฆฐ๋‹ค๋ฉด? ๋˜๋‹ค์‹œ Detected Memory Leaks!

    7.3. ๋ณด์™„๋ฒ• 1(class for function object)

    • ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด delete๋ฅผ ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ ๋งŒ๋“œ๋Š” ๋ฒ•์ด ์žˆ๋‹ค.(๋ญ์•ผ ์ด๊ฑฐ?)
      • Fucntion Object ๋ณดํ†ต classํ‚ค์›Œ๋“œ๋ฅผ ์“ฐ๋˜๋ฐ, struct(์ดํ•˜ class๋ผ๊ณ  ์”€)๋ฅผ ์จ๋†จ๊ตฐ. ๋ญ, ๋ณ„ ์ƒ๊ด€์—†์ง€๋งŒ, ๋‚ด๋ถ€ ์ธ์ž ์—†์ด ํ•จ์ˆ˜๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋œ class์ด๋‹ค. STL์—์„œ Generic ์„ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ฃผํšจํ•œ ๋ฐฉ๋ฒ•์ด๊ณ , ํ•จ์ˆ˜๋กœ๋งŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์„œ, ์ปดํŒŒ์ผ์‹œ์— ์ „๋ถ€ inline์‹œํ‚ฌ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Œ. ์˜ค ๋ถ€์ง€๋Ÿฐํžˆ ๋ณด๋Š”๊ฐ€ ๋ณด๋„ค. ๋‚˜์˜ ๊ฒฝ์Ÿ์‹ฌ์„ ์ž๊ทน ์‹œํ‚ค๋Š” ^^;; --์ƒ๋ฏผ

    ~cpp 
    struct DeleteObject : public unary_function<const T*, void>
    {
             template<typename T>
    	void operator()(const T* ptr) const
    	{
    		delete PTR;
    	}
    };
    
    void f()
    {
    	...
    	for_each(v.begin(), v.End(), DeleteObject());    // ์ •๋ง ์ด์ƒํ•˜๊ตฐ..--;
    }
    
    • ๋ฐ‘์—๊บผ ์“ฐ๊ณ  ๋ง๋ถ™์ด๋Š” ๊ฑด๋ฐ ์ด ๋ฐฉ๋ฒ•์€ ์—ด๋ผ ์•ˆ์ข‹์€ ๊ฑฐ๋ž€๋‹ค.(struct DeleteObject, ์ณ‡ ๊ทธ๋Ÿฌ๋ฉด์„œ ๋ญํ•˜๋Ÿฌ ์„ค๋ช…ํ•ด?-.-)

    7.4. ๋ณด์™„๋ฒ• 2(Smart Pointer)

    • ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์— ํฌ์ธํ„ฐ๋ฅผ ๋„ฃ๋Š” ๋Œ€์‹  ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.(์•„์•…..--; MDC++(MEC++)์„ ๋ด์•ผ ํ•˜๋Š”๊ฐ€..ใ… .ใ… )

    ~cpp 
    typedef boost::shared_ptr<Object> SPO;	// boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋Š”๊ฒŒ ์žˆ๋‹จ๋‹ค.
    
    vector<SPO> v;
    for(int i = 0 ; i < 10 ; ++i)
    	v.push_back(SPO(new Object));
    



    8. Item8. Never create containers of auto_ptrs.

    • ์ƒ๋žต. ๋„๋ฌด์ง€ ๋ญ”๋งํ•˜๋Š”๊ฑด์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. COAP๋Š” ๋˜ ๋ญ๊ณ ..--;
      • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜คํ†  ํฌ์ธํ„ฐ๋กœ ์ƒ์„ฑํ•˜์ง€ ๋ง๊ฒƒ~


    9. Item9. Choose carefully among erasing options.

    9.1. ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ int๊ฐ’๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ฑฐ๊ธฐ์„œ 1982 ๋ผ๋Š” ์ˆซ์ž๋ฅผ ๋ชฝ๋•… ์ง€์›Œ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด?

    • Contiguous-memory container ์ผ๋•Œ

    ~cpp 
    c.erase( remove(c.begin(), c.end(), 1982), c.end() );        // ์ด๊ฑด ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ๊ฑธ๊นŒ. ์ฐพ์•„๋ด์•ผ๊ฒ ๊ตฐ. 
    
    • list์ผ๋•Œ - erase ์จ๋„ ๋˜์ง€๋งŒ remove๊ฐ€ ๋” ํšจ์œจ์ ์ด๋‹ค.

    ~cpp 
    c.remove(1982);
    
    • Associative container ์ผ๋•Œ - remove์“ฐ๋ฉด ๋‚œ๋ฆฌ๋‚œ๋‹ค.(์—†์œผ๋‹ˆ๊น--;) ๋˜ ์ œ๋„ค๋ฆญ ์•Œ๊ณ ๋ฆฌ์ฆ˜ remove๋„ ์—ญ์‹œ ์•ˆ๋œ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ง๊ฐ€์งˆ์ˆ˜๋„ ์žˆ๋‹ค.

    ~cpp 
    c.erase(1982);
    

    9.2. ์กฐ๊ฑด ๊ฒ€์‚ฌํ•ด์„œ ๋ชฝ๋•… ์ง€์›Œ์ฃผ๊ธฐ

    • ๋˜ ์ด์ƒํ•œ ํŒ์ด ์žˆ๊ตฐ. boolํ˜•์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๊ฐ™์ด ๋„ฃ์–ด์ฃผ๋ฉด ๊ทธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์€ ๋ชจ์กฐ๋ฆฌ ์ง€์›Œ์ฃผ๋Š”..(ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์ผ๊นŒ.. ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋Š” ์•„์ง๋„ ์–ธ์ œ ์“ฐ๋Š”๊ฑด์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ํ˜น์‹œ ์•„์‹œ๋Š”๋ถ„์€ ์ข€ ๊ฐ€๋ฅด์ณ ์ฃผ์„ธ์š”^^;)
      • ํ•จ์ˆ˜ํฌ์ธํ„ฐ์ž„. (๋˜๋Š” ์œ„์—์„œ์˜ ํ•จ์ˆ˜๊ฐ์ฒด.) ํ•ด๋‹น ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ ์กฐ๊ฑด์„ ํŒŒ์•…ํ•œ๋’ค ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋น„๊ต,์†ŒํŠธ ํ•˜๋Š” ์ผ์„ ๋งŽ์ด ํ•จ. --1002

    9.2.1. ์‰ฝ๊ฒŒ ํ• ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค

    ~cpp 
    bool badValue(int x) { ... }    // ๋„ฃ์–ด์ค„ ํ•จ์ˆ˜ ์„ ์–ธ
    

    ~cpp 
    c.erase( remove_if(c.begin(), c.end(), badValue), c.end() );    // Contiguous-memory Container์ผ๋•Œ(vector, deque, string)
    

    ~cpp 
    c.remove_if(badValue);    // list์ผ๋•Œ
    

    9.2.2. Associative Container ์ผ๋•Œ

    • ์‰ฝ์ง€๋งŒ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ• - remove_copy_if ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ง€์šฐ๊ณ  ์‹ถ์€๊ฑธ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฒƒ๋“ค์„ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋กœ ์˜ฎ๊ธด๋‹ค. ๊ทธ ๋‹ค์Œ์— ์›๋ž˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ ๊ฒƒ๊ณผ ๋ฐ”๊ฟ” ๋ฒ„๋ฆฐ๋‹ค.(์šฐ์šธํ•˜๊ตฐ--;)

    ~cpp 
    AssocContainer<int> c;    // map,multimap,set,multiset ๋“ฑ์„ ์ผ๋ฐ˜ํ™”ํ•œ ์ด๋ฆ„์ด๋‹ค. ์‹ค์ œ๋กœ ์ €๋Ÿฐ ์ด๋ฆ„์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ์—†๋‹ค.--;
    ...
    AssocContainer<int> goodValues;
    
    remove_copy_if(c.begin(), c.end(), inserter(goodValues, goodValues.end()), badValue);     // ํ—‰ ์ด๋ถ„๋ฒ•--;. ๋ณด๋ฉด์„œ ๋А๋ผ๋Š” ๊ฑฐ์ง€๋งŒ ์ •๋ง ์‹ ๊ธฐํ•œ๊ฑฐ ๋งŽ๋‹ค. ์ €๋Ÿฐ ๊ฒƒ๋“ค์„ ๋„๋Œ€์ฒด ๋ฌด์Šจ ์ƒ๊ฐ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์„์ง€..
    
    c.swap(goodValues);       // c๋ž‘ goodValues๋ž‘ ๋ฐ”๊พผ๋‹ค. ์ด๋Ÿฐ๊ฒƒ๋„ ์žˆ๊ตฐ.
    
    • ์–ด๋ ต์ง€๋งŒ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ• - ๋ญ ๋˜ ํŒŒ์ผ์— ์“ด๋‹ค๊ณ  ํ•ด์„œ ์ด์ƒํ•œ๋ฐฉ๋ฒ• ์“ฐ๋Š”๋ฐ ๊ทธ๋ƒฅ ๋„˜๊ฒผ๋‹ค.

    ~cpp 
    AssocContainer<int> c;
    
    for(AssocContainer<int>::iterator i = c.begin() ; c != c.end() ; )
    {
        if(badValue(*i))
        {
            c.erase(i++);     // ์ง€์›Œ์•ผ ํ•  ๊ฐ’์ด๋ฉด ์ผ๋‹จ ์ง€์šฐ๊ณ  ๋ฐ˜๋ณต์ž ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค. ํ›„์œ„ ์—ฐ์‚ฐ์ž๋Š” ๊ทธ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋ณต์‚ฌ๋ฅผ ํ•˜๊ธฐ &#46468;๋ฌธ์— ๊ฐ€๋Šฅํ•œ ์ผ์ด๋‹ค. 
        }                     // ๊ทธ๋ƒฅ ์ง€์šฐ๋ฉด ๊ทธ ๋ฐ˜๋ณต์ž๋Š” void๊ฐ€ ๋œ๋‹ค. ์•ˆ์ข‹๋‹ค--;
        else ++i;             // ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์ฆ๊ฐ€
    }
    

    9.3. ์žก๋‹ด

    • ๋ฐ˜๋ณต์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ฃจํ”„๋ฅผ ๋Œ๋‹ค๊ฐ€ ์–ด๋–ค ๊ฑธ ์ง€์šฐ๋ฉด, ๊ทธ๊ฑธ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋˜ ๋ฐ˜๋ณต์ž๋Š” ๊ฐฑ์‹ ๋œ๋‹ค. ๋‹ค์Œ์— ์–ด๋–ป๊ฒŒ ๋ ์ง€ ์žฅ๋‹ด ๋ชปํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ฃผ์˜ํ•˜์ž.


    10. Item10. Be aware of allocator conventions and restrictions.


    11. Item11. Understand the legitimte uses of custom allocators.


    12. Item12. Have realistic expectations about the thread safety of STL containers.

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