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