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