U E D R , A S I H C RSS

AcceleratedC++/Chapter5

1. Chapter 5 Using sequential containers and analyzing strings

  • —ฌํƒœŒ€ vectorž‘ string ฐ–ณ  ž˜ †€•˜‹ค. ด œ ดฒƒ“ค„ „˜–ด„œŠ” ฒƒ„ ‚ดํŽด ฒƒด‹ค. ทธŸฌฉด„œ ดธŒŸฌฆฌ ‚ฌšฉฒ•— Œ€ํ•ด ” ŠฒŒ ดํ•ดํ•˜ฒŒ  ฒƒด‹ค. ดธŒŸฌฆฌŠ” žฃŒตฌกฐ?ํ•จˆ˜งŒ„  œณตํ•ดŠ” ฒƒด •„‹ˆ‹ค. ํŠํŠํ•œ •„ํ‚คํ…ณ„ ฐ˜˜ํ•ด€‹ค. งˆ˜ vector˜ ‚ฌšฉฒ•„ •ŒฒŒ ˜ฉด, ‹คฅธฒƒ„ ‰ฝฒŒ ฐฐšธˆ˜ žˆŠ”ฒƒฒ˜Ÿ...

1.1. 5.1 Separating students into categories

  • fœฌ ํ•™ƒ •„‹Œ ํ•™ƒœกœ ‚˜ˆ  ณดž.
    ~cpp 
    bool fgrade(const Student_info& s)
    {
    	return grade(s) < 60;
    }
    
    vector<Student_info> extract_fails(vector<Student_info>& students)
    {
    	vector<Student_info> pass, fail;
    	for(vector<Student_info>::size_type i = 0; i != students.size() ; ++i)
    	{
    		if(fgrade(students[i]))
    			fail.push_back(students[i]);
    		else
    			pass.push_back(students[i]);
    	}
    	students = pass;
    	return fail;
    }
     
  • ฐธกฐกœ „˜–ด„ students˜  ˆ˜ ชจ‘ ฝ–ด“ค—ฌ„œ, 60 ดํ•˜ฉด fail ฒกํ„—, •„‹ˆฉด pass ฒกํ„— „€ ‹คŒ, students ฒกํ„ passฒกํ„กœ ฐ”ฟ”€‹ค. ทธฆฌณ  fail„ ฆฌํ„ดํ•ด€‹ค. ฆ‰ students—Š” f •„‹Œ ํ•™ƒงŒ, ฆฌํ„œ vector—Š” f œฌ ํ•™ƒงŒ ‚จ•„žˆฒŒ ˜Š” ฒƒด‹ค. ญ”€ € ‚ฆฌฆฌํ•˜‹ค. ” ‰ฌšด ฐฉฒ•ด žˆ„ “ํ•˜‹ค.

  • 1.1.1. 5.1.1 Erasing elements in place

  • ทธ ‡‹ค. ฉ”ชจฆฌ ‚ญ„€ žˆŠ” ฒƒด‹ค. forฃจํ”„€ ‚ •Œ—Š” ค‘ณต˜Š” ‘ฐœ˜ ฒกํ„€ กดžฌํ•˜Š” ฒƒด‹ค. ทธž˜„œ šฐฆฌ€ “ธ ฐฉฒ•€ งŒ•ฝ fฉด fail— ถ”€ํ•˜ณ , f •„‹ˆฉด ทธ žฆฌ—„œ €šฐŠ” ฒƒด‹ค. ฐ˜ฐ‘ฒŒ„ ดŸฐ ธฐŠฅด žˆ‹ค. ฐ กธ Šฆฌ‹ค. ž… ฅ ฐดํ„˜ –‘ด ปคงˆˆ˜ก „Šฅ  €ํ•˜Š” ธ‰ฒฉํ•˜‹ค. ฒกํ„—„œŠ” ค‘„— ํ•˜‚˜ €šฐฉด, ฉ”ชจฆฌ ํ†ตงธกœ ‹ค‹œ ํ• ‹ํ•˜ณ , €›ŒŠ” ง“„ ํ•ด•ํ•œ‹ค. O(n*n)˜ ‹œ„ด ํ•„š”ํ•œฒƒœกœ •Œณ  žˆ‹ค. ฒกํ„Š” ž„˜  ‘ด €Šฅํ•œ Œ€‹ , ค‘„ ‚ฝž…ด‚˜ ค‘„ ‚ญ œ˜ ํํฌŠค ํฌธฐํ•œ ฒƒด‹ค. ด œ€„—ฌŸฌ€€ ฐฉฒ•„ ‚ดํŽด ฒƒด‹ค.
  •  € Šฆฌ€งŒ, ง€ ธ ฐฉฒ•€„‚ดํŽดณดž.
    ~cpp 
    vector<Student_info> extract_fails(vector<Student_info>& students)
    {
    	vector<Student_info> fail;
    	vector<Student_info>::size_type i = 0
    	while(i != students.size()) {
    		if(fgrade(students[i])) {
    			fail.push_back(students[i]);
    			students.erase(students.begin() + i);
    		} else
    			++i;
    	}
    	return fail;
    }
     
    • ™œ students.erase(studentsi) ํ•˜€ •ŠŠ”€? ชจ“  ปจํ…Œด„ˆ— €„„  œณตํ•˜ธฐ œ„ํ•ด„œณ  ํ•œ‹ค. ฐ”กœ ฐ˜ณตž ถˆฆฌšฐŠ” ฒƒ„ ดšฉํ•ด, (ํฌธํ„ณด‹ค ฐ˜ณตž€  € ‚˜˜ค„š”.) ™ํ•œ ฐฉฒ•œกœ  œ–ด ํ• ˆ˜ žˆŠ” ฒƒด‹ค.
    • ทธ ณดฉด •Œฒ €งŒ, ณต‚ฌ ฒ‚˜ฒŒ ํ•ดŒ„‹ค. ํ•˜‚˜ €šธ•Œงˆ‹ค ทธ ’ค— žˆŠ”‹ค ณต‚ฌํ•˜Š” ฒƒด‹ค. งŒ•ฝ— ชจ‘ failดฉด? ”ฐํ•˜‹ค.
    • ˜ํ•œ, €›ŒคŒœกœจ ปจํ…Œด„ˆ˜ ‚ฌดฆˆ€ €ํ•œ‹ค. ฆ‰ ชจ“  ํ•™ƒ„ ‹ค €‚ฌํ•˜€ ชปํ• ˆ˜„ žˆ‹ค. ทธž˜„œ ‹คŒ ฐ™ด ฐ”ฟ”–ด• ํ•œ‹ค.

  • ~cpp 
    vector<Student_info> extract_fails(vector<Student_info>& students)
    {
    	vector<Student_info> fail;
    	vector<Student_info>::size_type i = 0;
             vector<Student_info>::size_type size = students.size();
    	while(i != size) {
    		if(fgrade(students[i])) {
    			fail.push_back(students[i]);
    			students.erase(students.begin() + i);
    		} else
    			++i;
    	}
    	return fail;
    }
     

    1.1.2. 5.1.2 Sequential versus random access

    • œ„˜ ฒกํ„Š” ž„˜  ‘ด ํ•„š”ํ•˜€ •Š‹ค. ทธƒฅ ˆœฐจ œกœ  ‘ํ•  ฟด‹ค. ž„˜ ‘„ ํฌธฐํ•จœกœจ ƒธฐŠ” —ฌŸฌ€€ ด“ด žˆŠ” ปจํ…Œด„ˆ€ žˆ„ ฒƒด‹ค. ทธณด‹ค  € ปจํ…Œด„ˆ ํšจ œกœ  œ–ดํ• ˆ˜ žˆฒŒ ํ•ดŠ” ฐ˜ณตžŠ” ฒƒ„  € ‚ดํŽดณดž.

    1.2. 5.2 Iterators

  • —ฌํƒœป ž˜“ฐ˜ ฒกํ„ฐํ˜• €ˆ˜n€ ฒกํ„˜ nฒˆงธ š”†Œ งํ•œ‹ค. €ธˆŒ€ ํ•˜˜ณดฉด ฃจํ”„ •ˆ—„œ ++i ดฐ–— —†‹ค. ฆ‰ ˆœฐจ œกœงŒ †€•˜‹คŠ” œปด‹ค. šฐฆฌŠ” •Œ€งŒ ปดํŒŒŸฌŠ” •Œธธด —†‹ค. —ฌธฐ„œ ฐ˜ณตž(Iterators)Š” ฒƒ„ •Œ•„ณดž.
    • ปจํ…Œด„ˆ™€ ปจํ…Œด„ˆ •ˆ˜ š”†Œ ํ™•ธ
    • ทธ š”†Œ •ˆ—  €žฅ˜–ด žˆŠ” ฐ’ ํ™•ธ
    • ปจํ…Œด„ˆ •ˆ˜ š”†Œ“ค ‚ฌด ™”‹คฐ”‹ค ํ• ˆ˜ žˆŠ” ธฐŠฅ
    • ปจํ…Œด„ˆ€ ํšจ œกœ ‹คฃฐˆ˜ žˆŠ” —ฐ‚ฐงŒ„ €€ณ  †€„ก  œํ•œํ•˜Š” ธฐŠฅ
  • ธˆ˜ๆ›ฐ : STL„ ‚ฌšฉํ• •Œ—Š” ฐ˜ณตž ดšฉํ•˜Š” ฒƒด ํ‘œ€ด ํ•œ‹ค.
  • ธŠคกœ ง  ฝ”“œ ฐ˜ณตžกœ ง  ฝ”“œกœ ฐ” ˜ˆ
    ~cpp 
    for(vector<Student_info>::size_type i = 0 ; i != students.size() ; ++i)
    	cout << students[i].name << endl;		
     

    ~cpp 
    for(vector<Student_info>::const_iterator i = students.begin() ; i != students.end() ; ++i)
    	cout << (*i).name << endl;
     

  • ƒ†Œํ•œฒŒ ณดด€ •ŠŠ”€? ํ•˜‚˜ํ•˜‚˜”ฉ ‚ดํŽดณดž.

  • 1.2.1. 5.2.1 Iterator types

  • ํ‘œ€ ปจํ…Œด„ˆ—  •˜ ˜–ด žˆŠ” ฐ˜ณตž˜ ข…ฅ˜Š” ‹คŒ ‘€€‹ค.
    • const_iterator : ฐ’„ €ฒฝ‹œํ‚ค€ •Šณ  ˆœํšŒํ• •Œ
    • iterator : ทธƒฅ ˆœํšŒํ• •Œ
  • „€ ธ ชฐ„ œ‹ค.
  • ํ•„š”— ”ฐ iterator—„œ const_iteratorกœ บŠคํŒ…œ‹ค. ฐ˜Œ€Š” •ˆœ‹ค.

  • 1.2.2. 5.2.2 Iterator Operations

  • begin() end()Š” ฐฐ ปจํ…Œด„ˆ˜ งจ ฒ˜Œ š”†Œ €ฆฌํ‚คŠ” ฐ˜ณตž™€, งจ งˆ€ง‰—„œ ํ•œ€‚œ ฒƒ„ €ฆฌํ‚คŠ” ฐ˜ณตž ฆฌํ„ดํ•ด€‹ค.
  • ++i : ทธƒฅ “ฐฉด œ‹ค. ฐ ปจํ…Œด„ˆงˆ‹ค ตฌํ˜„€ ‹คํ…Œ€งŒ, †€šธ  •„˜ ถ”ƒํ™”กœ ‚ฌšฉž“คกœ ํ•˜—ฌธˆ ชจฅดณ  จ„ ˜ฒŒ งŒ“ค—ˆ‹ค. ฐ˜ณตž ํ•˜‚˜”ฉ ฆ€‹œํ‚คŠ” ฒƒด‹ค.
  • '*' : —ญฐธกฐ —ฐ‚ฐž ถˆฆฌšด‹ค.
  • (*i).name : ฐ˜ณตž i€ €ฆฌํ‚คŠ” š”†Œ˜ ฉค„ name„ งํ•œ‹ค. „ํ˜ธ จž. šฐ„ ˆœœ„€ .ด *ณด‹ค †’ธฐ •Œฌธ— —Ÿฌ‚œ‹ค.

  • 1.2.3. 5.2.3 Some syntactic sugar

  • (*i).name ด ‡ฒŒ ํ•˜ธฐ €ฐฎ‹ค. i->name ด ‡ฒŒ ํ•˜ฉด œ‹ค.

  • 1.2.4. 5.2.4 The meaning of students.erase(students.begin() + i)

  • begin()ด งจ ฒ˜Œ š”†Œ €ฆฌํ‚คŠ” ฐ˜ณตž ฆฌํ„ดํ•ด€‹คณ  ํ–ˆ‹ค. ทธŸ i ”ํ•˜ฉด? iฒˆ쨰 š”†Œ €ฆฌํ‚คŠ” ฐ˜ณตž€ ฆฌํ„ ฒƒด‹ค.
  • ํ•˜€งŒ ž„˜  ‘„ €›ํ•˜€ •ŠŠ” ปจํ…Œด„ˆ—‹ค  €ง“ํ•˜ฉด •ˆœ‹ค. + —ฐ‚ฐž€  •˜˜–ด žˆ€ •Šธฐ •Œฌธ— ปดํŒŒ —Ÿฌ œฌ‹ค.

  • 1.3. 5.3 Using iterators instead of indices

  • ธŠค “ฐ˜ ํ•จˆ˜ ฐ˜ณตžกœงŒ ฐ”ฟ” ณดž.
    ~cpp  
    vector<Students_Info> extract_fails(vector<Student_info>& students)
    {
    	vector<Student_info> fail;
    	vector<Student_info>::iterator iter = students.begin();
    	while(iter != students.end()) {
    		if(fgrade(*iter)) {
    			fail.push_back(*iter);
    			iter = students.erase(iter);
    		} else
    			++iter;
    	}
    	return fail;
    }
     
  • •„ŒŠ” const˜€Š”ฐ ดฒˆ—” ™œ •„‹ˆƒณ ? ปจํ…Œด„ˆ •ˆ— žˆŠ” ฒƒ„ €šฐ€ •ŠŠ”€. ฆ‰ €ํ˜•‹œํ‚จ‹คŠ” ฒƒด‹ค.
  • ˜ ‹ ธฐํ•œฒŒ ณดธ‹ค. ™œ students.erase(iter) ํ•ด€ฒƒ„ ˜ iter—‹ค Œ€ž…ํ•ด—ˆŠ”€? ‚ญ œํ•˜ฉด ฐ˜ณตž€ ชจ‘ ‹ ˜ธฐ •Œฌธด‹ค. €šด ’ท€„€ ชฝ•… žฌํ• ‹ ํ•ด•ํ•˜‹ˆ... €ธˆ€ ฌดŠจ งธ€ ชฐ„ ข‹‹ค. ทธ ‡‹คŠ” ฒƒงŒ •Œ•„‘ž. eraseŠ” ฐฉธˆ €šด ฐ”กœ ทธ €€„ ฆฌํ„ดํ•ด€‹ค.
  • ˜ ฝ”“œ ตœ ํ™” ํ•œ‹คณ  ‹คŒณ  ฐ™€ ‚ฝงˆ„ ํ•˜Š” ‚ฌžŒ„ žˆ„ ฒƒด‹ค.
    ~cpp 
    while(iter != students.end())
    /*...*/
     
  • „
    ~cpp 
    vector<Student_info>::iterator iter = students.begin(). end_iter = students.end();
    while(iter != end_iter)
    /*...*/
     
  • ด ‡ฒŒ งด‹ค. ํ•˜€งŒ •ˆœ‹ค. •„Œ งํ–ˆ“ด, ํ•˜‚˜ €šฐฉด ทธ ’ค˜ ฐ˜ณตžŠ” ชจ‘ ‹ ˜ธฐ •Œฌธ—, ฆฌ  €žฅํ•ด†“€ end_iterŠ” “ธชจ€ —†–ด„‹ค. “ฐ ˆธฐ ฐ’ด ‚จŠ” ฒƒด‹ค.

  • 1.4. 5.4 Ranking our data structure for better performance

  • ฒกํ„Š” ž„˜  ‘„ €›ํ•˜Š” Œ€‹ —, ค‘„ ‚ฝž…, ‚ญ œ˜ „Šฅด ž‹ค. ทธŸฌ€กœ ค‘„ ‚ฝž…, ‚ญ œ€ ตœ ํ™”œ ƒˆกœšด žฃŒตฌกฐ ƒฐํ•ด ณดž.

  • 1.5. 5.5 The list type

  • ฐ”กœ list‹ค. ค‘„ ‚ฝž… ‚ญ œ ƒˆ˜‹œ„ ‚ด— ˆ˜ํ–‰ํ• ˆ˜ žˆ‹ค. ด œ vectorกœ ง  ฝ”“œ listกœ ง  ฝ”“œกœ ฐ”ฟ”ณดž. ฐ”€ฒŒ „กœ —†‹ค. vector€ listกœ ฐ”€งณ Š”... ‹ค‹œ ํ•œฒˆ งํ•˜€งŒ listŠ” ž„˜  ‘„ €›ํ•˜€ •ŠŠ”‹ค. ”ฐ„œ vector—„œ “ฐ˜ฒƒฒ˜Ÿ [] “ฐฉด •ˆœ‹ค.

  • 1.5.1. 5.5.1 Some important differences

  • ฒกํ„Š” ‚ฝž…, ‚ญ œ ํ• •Œงˆ‹ค ฉ”ชจฆฌ ชฝ•… žฌํ• ‹ํ•œ‹ค. ”ฐ„œ ~~.end()Š” „ทธ˜ ˜จƒด ™‹ค. „† ฐ”€Œ€กœ... ํ•˜€งŒ listŠ” ‚ฝž…, ‚ญ œํ•œ‹คณ  ชฝ•… žฌํ• ‹ํ•˜€ •ŠŠ”‹ค. ทธž˜„œ  ฅธ ฒƒด‹ค. ˜ํ•œ ž„˜  ‘„ €›ํ•˜Š” ปจํ…Œด„ˆงŒ “ธˆ˜ žˆŠ” ํ‘œ€ •Œณ ฆฌฆ˜ sort„ ‹—ฐํžˆ “ธˆ˜ —†‹ค. ทธž˜„œ list˜ ฉค„ํ•จˆ˜กœ sort€ žˆ‹ค. ‹คŒ ฐ™ด จž.
    ~cpp 
    students.sort(compare);
     

  • 1.5.2. 5.5.2 Why bother?

  • ํ‘œ ณดฉด •Œฒ €งŒ, ํŒŒ ํฌธฐ€ ปคงˆˆ˜ก vector˜ š”†Œ ‚ฝž…, ‚ญ œ ‹œ„€ „•ฝ œกœ ฆ€ํ•œ‹ค. listŠ” „กœ •ˆ ฆ€ํ•œ‹ค.

  • 1.6. 5.6 Taking strings apart

  • string„ vectorฒ˜Ÿ “ธˆ˜ žˆ‹ค. ‹ค œกœŠ” vector<char>ด‹ˆ... vector˜ Œ€€„˜ ธฐŠฅ„ €›ํ•œ‹ค. [] ฐ˜ณตžŠ” ก  size() ““„..
  • ทธŸฌฉด„œ –ด„ string„ ณต„ ธฐ€œกœ žฅธ ‹คŒ vector— „–ด„œ ฆฌํ„ดํ•˜Š” ˜ˆ œ ณด—ฌณ  žˆ‹ค. „กœ —†‹ค.
  • 1.7. 5.7, 5.8

  • ทธƒฅ string€€ณ  ํ™”ฉด— ฟŒฆฌŠ” ดƒํ•œ žฅ‚œ˜ณ  žˆ‹ค. „กœ —†‹ค.
  • €ธˆ ณด‹ˆŒ “ธงŒํ•œ ํŒด ํ•˜‚˜ žˆ‹ค. ฐ”กœ ํ•œ ปจํ…Œด„ˆ— ‹คฅธ ปจํ…Œด„ˆ˜ ‚ดšฉ“ค„ „Š” ˜ˆ œด‹ค.
    ~cpp 
    for(vector<string>::const_iterator i = bottom.begin(); i != bottom.end(); ++i)
        ret.push_back(*it);
     
  • ด ‡ฒŒ “ธฒƒ„,
    ~cpp 
    ret.insert(ret.end(), bottom.begin(), bottom.end());
     
  • ด ‡ฒŒ „‹จํžˆ “ธˆ˜ žˆ‹ค.


  • Valid XHTML 1.0! Valid CSS! powered by MoniWiki
    last modified 2021-02-07 05:22:25
    Processing time 0.0411 sec