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