U E D R , A S I H C RSS

AcceleratedC++/Chapter6

1. Chapter 6 Using Library Algorithms

  • 5žฅ—„œ ณธฒƒฒ˜Ÿ šฐฆฌ€ ‹คฃจŠ” ปจํ…Œด„ˆ“ค€ ‚ด€ ‚ฌ •€ ‹ค€„, šฐฆฌŠ” ทธฒƒ„ ชจฅดณ „ ˜‘ฐ™ด “ธ ˆ˜€ žˆ‹ค. ฆ‰ €œ ธํ„ฐํŽ˜ดŠค  œณตํ•œ‹คŠ” ฒƒด‹ค. ปจํ…Œด„ˆ‚˜ ฐ˜ณตž™€ งˆฐฌ€€กœ ํ‘œ€ ดธŒŸฌฆฌ„ €œ ธํ„ฐํŽ˜ดŠค  œณตํ•œ‹ค. ฒกํ„ ฐฐ› œฉด ฆฌŠคํŠธ„ ธˆฐฉ “ธˆ˜ žˆŠ” ฒƒฒ˜Ÿ, ํ•˜‚˜˜ •Œณ ฆฌฆ˜ “ฐŠ” ฒ•„ ฐฐšฐฉด, ‹คฅธ ฒƒ “ฐŠ” ฒ•„ ธˆฐฉ •Œˆ˜€ žˆ‹ค.

1.1. 6.1 Analyzing strings

  • Chapter5˜ งˆ€ง‰— ฃจํ”„ „ธ ‹คŒ ฐ™€ ตฌฌธด žˆ—ˆ‹ค. ret˜ —‹ค€ bottom˜ ฒ˜Œ€„Œ€ „Š”‹คŠ” œปด‹ค.
    ~cpp 
    ret.insert(ret.end(), bottom,begin(), bottom.end());
      

  • ฐ ดฒƒณด‹ค ” ฐ˜ ธ, (ฆ‰ ปจํ…Œด„ˆ— …ฆฝ ธ) ฐฉฒ•ด žˆ‹ค. ปจํ…Œด„ˆ˜ ฉค„ํ•จˆ˜ ดšฉํ•˜Š” ฒƒด •„‹Œ, ํ‘œ€ •Œณ ฆฌฆ˜„ ดšฉํ•˜Š” ฒƒด‹ค. œ„˜ ฒƒ ™ํ•œ ธฐŠฅ„ ํ•œ‹ค.
    ~cpp 
    copy(bottom.begin(), bottom.end(), back_inserter(ret));
      

  • Œ. ˜ ƒˆกœšด ฒƒด ณดด€ •ŠŠ”€? copyŠ” generic algorithm˜ ˜ˆดณ , back_inserterŠ” ฐ˜ณตž –ดŒ‘ํ„˜ ˜ˆด‹ค. ดฒŒ ฌด—‡ธ€Š” ฐจฐจ ‚ดํŽดณด„ก ํ•˜ž.
  • Generic algorithmดŠ” ปจํ…Œด„ˆ˜ €„ด •„‹Œ •Œณ ฆฌฆ˜ด‹ค. ํŒŒฉ”ํ„กœ ฐ˜ณตž ฐ›Š”‹ค. „Šทํ•˜€ •Š€€? .ด —†‹ค ฟด€ ทธƒฅ “ฐž.
  • Postfix™€ Prefix : i++ ++i˜ ฐจด ด‹ค. ++iŠ” i ‚ฌšฉํ•˜ธฐ  „— ฐ’„ ฆ€‹œํ‚คณ , i++€ i ‚ฌšฉํ•œ ํ›„— ฐ’„ ฆ€‹œํ‚จ‹ค.
  • ‹คŒœกœ ฐ˜ณตž –ดŒ‘ํ„ฐ(Iterator Adapters) ‚ดํŽดณดž. ฐ˜ณตž –ดŒ‘ํ„Š” ปจํ…Œด„ˆ ธžกœ ฐ›•„,  •ํ•ด„ ž‘—…„ ˆ˜ํ–‰ํ•˜ณ  ฐ˜ณตž ฆฌํ„ดํ•ดŠ” ํ•จˆ˜ด‹ค. copy•Œณ ฆฌฆ˜— “ฐธ back_inserterŠ” ret˜ ’ค—‹ค€ copy ˆ˜ํ–‰ํ•œ‹คŠ” ฒƒด‹ค. ทธŸ ‹คŒ ฐ™ด “ฐณ  ‹ถ€ ‚ฌžŒ„ žˆ„ ฒƒด‹ค.
    ~cpp 
    copy(bottom.begin(), bottom.end(), ret.end());
      
  • •ž—„œ„ งํ–ˆ€งŒ, end()—Š” •„ฌดฒƒ„ —†‹ค.
  • ™œ ด ‡ฒŒ „„ํ–ˆŠ”€? ํ”„กœทธž˜จธกœ ํ•˜—ฌธˆ “ฐณ  ‹ถ€ —ฐ‚ฐ„ ณจ„œ “ธˆ˜ žˆฒŒ ํ•˜ธฐ •Œฌธด‹ค.

1.1.1. 6.1.1 Another way to split

  • 5žฅ—„œ ณต€ํ•œ ฒƒ ค‘— –ด„ string„ ณต„ ธฐ€œกœ ž˜„œ, vector—‹ค „€ ‹คŒ ฆฌํ„ดํ•ดŠ” ํ•จˆ˜€ žˆ—ˆ‹ค.(split) ดฒƒ„ € ” „‹จํžˆ งŒ“ค–ดณดž. •ž˜ ฒƒ€ ต‰žฅํžˆ •Œ•„ณดธฐ ํž˜“คฒŒ ˜–ดžˆ‹ค.
    ~cpp 
    vector<string> split(const string& str)
    {
     typedef string::const_iterator iter;
     vector<string> ret;
     iter i = str.begin();
     while(i != str.end()) {
      i = find_if(i, str.end(), not_space); // ณตด •„‹Œ €„„ ฐพณ 
      iter j = find_if(i, str.end(), space); // ณตธ €„„ ฐพ•„„œ
      if(i != str.end())
       ret.push_back(string(i,j)); // ทธงŒํ˜ ฌธž—ด—˜ ฒกํ„— „Œ
      i = j;
     }
     return ret;
    }
      
  • ํ›จ”ฌ •Œ•„ณดธฐ ‰ฌ›ŒกŒ‹ค. 5žฅ˜ split€ find_ifงˆ‹ค —ด‹ฌํžˆ ฃจํ”„ Œ ธ—ˆ‹ค. ด œ ฐจฐจ ‚ดํŽดณดž.
  • find_if˜ ธž ณดฉด, •ž˜ ‘ฐœ˜ ธžŠ” ฒ”œ„ ˜ธํ•œ‹ค. ฒซธž~‘ฒˆงธธž งด‹ค. งˆ€ง‰ ธžŠ” boolํ˜•„ ฆฌํ„ดํ•˜Š” ํ•จˆ˜ „–ด€‹ค. ฆ‰ predicaterด‹ค. ทธŸฌฉด find_ifŠ” –ด„ ฒ”œ„ ‚ด—„œ predicator งŒํ•˜Š” €„˜ ฐ˜ณตž ฆฌํ„ดํ•ด €‹ค.
  • isspaceŠ” ํ‘œ€ ดธŒŸฌฆฌ—„œ €›ํ•˜Š” ํ•จˆ˜ž„—‹ค ถˆตฌํ•˜ณ , ™œ ”ฐกœ งŒ“ค—ˆ„Œ? ฐ”กœ isspaceŠ” —ฌŸฌ –ธ–ด „ œกœ ˜ค„กœ”ฉ ˜–ด žˆธฐ •Œฌธด‹ค. ํ…œํ”Œฆฟ ํ•จˆ˜˜ ธžกœ ˜ค„กœ”ฉœ ํ•จˆ˜ „˜ฒจŠ” ฒƒ€ ‰ฝ€ •Š‹ค. –ด–ค „ ธ€ •Œˆ˜€ —†ธฐ •Œฌธด‹ค. ดฒƒด šฐฆฌ€ isspace—ญํ• „ ํ•˜Š” ํ•จˆ˜ ƒˆกœ งŒ“  ดœ ‹ค.
  • 5žฅ—„œŠ” string(i,j) Œ€‹ —, substrดŠ” ํ•จˆ˜ ดšฉํ–ˆ—ˆŠ”ฐ, ดฒˆ— “ฐ€ •Š€ ดœ Š” substr€ ฐ˜ณตž ธžกœ ฐ›€ •Šธฐ 떄ฌธด‹ค.
  • ˜ํ•œ  œ„ฆญ •Œณ ฆฌฆ˜€ end() ””ํ•˜ฒŒ ฒ˜ฆฌํ•ด€‹ค. šฐฆฌ€ ‹ ฒฝ•ˆจ„ œ‹คŠ” ฒƒด‹ค.

  • 1.1.2. 6.1.2 Palindromes

  • Palindromeดž€ •ž—„œ€„ฝ–ด„ ’ค—„œ€„ฝ–ด„ ˜‘ฐ™€ ‹จ–ด ˜ธํ•œ‹ค.
    ~cpp 
    bool isPalindrome(const string& s)
    {
     return equal(s.begin(), s.end(), s.rbegin());
    }
      
  • ฐธ ””ํ•˜‹ค. rbegin()€ —ญ‹œ ฐ˜ณตž ฆฌํ„ดํ•ดŠ” ํ•จˆ˜ด‹ค. พธกœ „‹ค. equalํ•จˆ˜Š” ‘ฐœ˜ ตฌ„„ „ตํ•ด„œ ฐ™„ ฒฝšฐ bool ˜ true ฐ’„ ฆฌํ„ดํ•œ‹ค. ํŒŒงคํ„กœ ฒซฒˆงธ ตฌ„˜ ‹œž‘ , ‘ฒˆงธ ตฌ„˜ ‹œž‘ iterator ฐ›Š”‹ค. ‘ฒˆงธ ตฌ„˜ „ ‚˜ํƒ€‚ดŠ” iterator š”ตฌํ•˜€ •ŠŠ” ดœ Š”, ‘ฐœ˜ ตฌ„˜ ธธด€ ฐ™‹คณ  € •ํ•˜ธฐ •Œฌธด‹ค. ดŠ” equal ํ•จˆ˜˜ ™ž‘„ ƒฐํ•ด •Œ ํ•ฉ‹ํ•œ ฒ˜ฆฌด‹ค.
  • 1.1.3. 6.1.3 Finding URL


    ~cpp 
    #ifndef GUARD_urls_h
    #define GUARD_urls_h
    #include <vector>
    #include <string>
    std::vector<std::string> find_urls(const std::string& s);
    #endif
      

    ~cpp 
    #include <algorithm>
    #include <cctype>
    #include <string>
    #include <vector>
    #include "urls.h"
    
    using std::find;
    using std::find_if;
    using std::isalnum;
    using std::isalpha;
    using std::isdigit;
    using std::search;
    using std::string;
    using std::vector;
    
    bool not_url_char(char);
    string::const_iterator url_end(string::const_iterator, string::const_iterator);
    string::const_iterator url_beg(string::const_iterator, string::const_iterator);
    
    vector<string> find_urls(const string& s)
    {
     vector<string> ret;
     typedef string::const_iterator iter;
     iter b = s.begin(), e = s.end();
    
     // look through the entire input
     while (b != e) {
      // look for one or more letters followed by `://'
      b = url_beg(b, e);
      // if we found it
      if (b != e) {
       // get the rest of the \s-1URL\s0
       iter after = url_end(b, e);
       // remember the \s-1URL\s0
       ret.push_back(string(b, after));
       // advance `b' and check for more \s-1URL\s0s on this line
       b = after;
      }
     }
     return ret;
    }
    
    string::const_iterator url_end(string::const_iterator b, string::const_iterator e)
    {
     return find_if(b, e, not_url_char);
    }
    
    // find_if ํ•จˆ˜˜ ํ…ŒŠคํŒ…— ดšฉ˜Š” ํ•จˆ˜ด‹ค. char€ string ˜ iterator˜ ฐ’ด‹ค.
    bool not_url_char(char c)
    {
     // characters, in addition to alphanumerics, that can appear in a \s-1URL\s0
     static const string url_ch = "~;/?:@=&$-_.+!*'(),";
     // see whether `c' can appear in a \s-1URL\s0 and return the negative
     return !(isalnum(c) ||
              find(url_ch.begin(), url_ch.end(), c) != url_ch.end());
    }
    
    //ด ˜ˆ œ˜ ํ•ต‹ฌ ํ•จˆ˜ด‹ค.
    string::const_iterator url_beg(string::const_iterator b, string::const_iterator e)
    {
     /*
      b Š” protocol type˜ ‹œž‘œ„˜ €ฅดํ‚คฒŒœ‹ค.
      i Š” :// ˜ ‹œž‘ œ„˜ €ฆฌํ‚คŠ” —ญํ• „ ํ•œ‹ค.
      e Š” url˜ งˆ€ง‰ ํ…ŠคํŠธ €ฆฌํ‚คŠ” —ญํ• „ ํ•œ‹ค.
      */
     static const string sep = "://";
     typedef string::const_iterator iter;
    
     // `i' marks where the separator was found
     iter i = b;
    
     // string —„œ sep ˜ ฌธž—ด˜ ‹œž‘€„„ ฐพ•„„œ i— iterator Œ€ž…ํ•œ ํ›„ e™€ „ตํ•˜—ฌ
     // ฐ™€ •Šœฉด ‹คํ–‰ํ•œ‹ค. (ฆ‰, sep ฐพ•˜„ ฒฝšฐ)
     while ((i = search(i, e, sep.begin(), sep.end())) != e) {
      // make sure the separator isn't at the beginning or end of the line
      if (i != b && i + sep.size() != e) {
       // `beg' marks the beginning of the protocol-name
       iter beg = i;
       while (beg != b && isalpha(beg[-1]))
        --beg; //protocol-typed˜ œ„˜— กดžฌํ•˜Š” ฌธž—ดด กฐ— งž„ ฒฝšฐ •žœกœ ํ•œ”ฉ ›€งดฉด„œ €‚ฌํ•œ‹ค.
       // is there at least one appropriate character before and after the separator?
       if (beg != i && !not_url_char(i[sep.size()]))
        return beg;
      }
      // the separator we found wasn't part of a \s-1URL\s0; advance `i' past this separator
      i += sep.size();
     }
     return e;
    }
      
  • ด ˜ˆ œŠ” string STL„ ดšฉํ•ด„œ ฌธž—ด„ €ƒ‰ํ•˜ณ , šฐฆฌ—ฒŒ งžŠ”  •ณด €ณตํ•˜Š” ฒƒด ชฉ ด‹ค.
  • protocol-type://domainname ˜ ํ˜•ํƒœ €‚ฌํ•œ‹ค.
  • search(b, e, b2, e3) [b, e)˜ ฌธž—ด ‹œํ€€Šค—„œ [b2, e3) ฌธž—ด ‹œํ€€Šค ฐพŠ”‹ค.
  • find(b, e, t) ฌธž—ด ‹œํ€€Šค [b, e)—„œ ฐ’ t ฐพŠ”‹ค.
  • find_if(b, e, p) ฌธž—ด ‹œํ€€Šค [b, e)—„œ ํ•จˆ˜ p ํ†ตํ•ด ํ…ŒŠคํŠธํ•œ‹ค.
  • static Šคํ† ฆฌ€ € •žŠ” ํ•จˆ˜˜ ตœดˆ ƒ„‹œ  €žฅณต„— ‹จ ํ•œฒˆงŒ ํ• ‹˜ฉฐ, ‹ค‹œ ํ˜ธถœ„ ํ•˜—ฌ„ ƒˆกœ ํ• ‹˜€ •ŠŠ”‹ค.

  • 1.2. 6.2 Comparing grading schemes

    Chapter 4.2—„œ  œ‹œœ ค‘•™ฐ’„ ดšฉํ•œ ฐฉ‹œกœ „ „ „‚ฐํ•  ฒฝšฐ •…˜ œกœ
     œ„  œถœํ•˜€ •ŠŠ” ํ•™ƒ˜ ฐœƒด — คœ‹ค.
    —ฐ –ดŠ  •„กœ ฒฐ— ˜ํ–ฅ„ Š”€ ‹ค œกœ ํ”„กœทธžจ„ ž‘„ํ•˜—ฌ ํ™•ธํ•ดณธ‹ค.
    1. ค‘•™ฐ’ Œ€‹  ํ‰ท „ ‚ฌšฉํ•˜ฉฐ,  œถœํ•˜€ •Š€  œ—Š” 0 „ Š” ฐฉ‹(6.2.3)
    2. ‹ค œกœ  œถœํ•œ  œ— Œ€ํ•ด„œงŒ ค‘•™ฐ’„  šฉํ•˜Š” ฐฉฒ•(6.2.4)
    3. ค‘•™ฐ’„ ดšฉํ•˜—ฌ ํ‰ท „ ดšฉ(6.2.2)

    ด œ„ํ•œ „€ž‘—…
    1. ชจ“  ํ•™ƒ˜  ˆฝ”“œ ฝ–ด“ค—ฌ, ชจ“   œ  œถœํ•œ ํ•™ƒ“ค ทธ ‡€ •Š€ ํ•™ƒ“ค„ ตฌ„ํ•ฉ‹ˆ‹ค.(6.2.1)
    2. ‘ „‚ฐฒ•„(œ„˜1,2 ˜ธ, 3„ ํฌํ•จํ•ด•ํ• “..@,.@) ฐ ทธ˜ ชจ“  ํ•™ƒ“ค—ฒŒ ฐฐ  šฉํ•˜ณ , ฐ ทธ˜ ค‘•™ ฐ’„ ถœ ฅํ•ฉ‹ˆ‹ค.(6.2.2)

    1.2.1. 6.2.1 Working with student records


    1.2.1.1. ชจ“   œ  œถœํ–ˆŠ”€ ํŒ„ํ•˜Š” ํ•จˆ˜


    ~cpp 
      bool did_all_hw(const Student_info& s)
      {
      	return ((find(s.homework.begin(), s.homework.end(), 0)) ==
      		s.homework.end());
      }
     
    findํ•จˆ˜Š” ฒ˜Œ‘ฐœ˜  „‹ฌธž ฒ”œ„—„œ „ฒˆงธ  „‹ฌธž˜ ฐ’„ ฐพ€ ชปํ•˜ฉด 2ฒˆงธ  „‹ฌธž ฆฌํ„ดํ•œ‹ค. (ฐพœฉด ฒซฒˆงธ „‹ฌธž
    ฆฌํ„ดํ•œ‹ค˜ฐ...@,.@ž˜ชปœ•„‹Œ€??) ณ กœ ฐพ€ชปํ•˜ฉด s.homework.begin() == s.homework.begin()ด ˜€กœ true ฆฌํ„ดํ•จ

    1.2.1.2. ํ•™ƒ  ˆฝ”“œ ฝณ  „ฅ˜ํ•˜Š” ฝ”“œ


    ~cpp 
      vector<Student_info> did, didnt;
      // read the student records and partition them
      Student_info student;
      while (read(cin, student)) {
       if (did_all_hw(student))
        did.push_back(student);
       else 
        didnt.push_back(student);
      }
     	 // verify that the analyses will show us something
      if (did.empty()) {
      cout << "No student did all the homework!" << endl;
       return 1;
      }
     
      if (didnt.empty()) {
      cout << "Every student did all the homework!" << endl;
       return 1;
      } 
     
    emptyฉค„ํ•จˆ˜: ปจํ…Œด„ˆ€ „–ด žˆœฉด true, •„‹ˆฉด falseฆฌํ„

    1.2.2. 6.2.2 Analyzing the grades

    1.2.2.1. ดˆธฐ median_analysis ํ•จˆ˜


    ~cpp 
    // ด ํ•จˆ˜Š”  œŒ€กœ ™ž‘ํ•˜€ •ŠŠต‹ˆ‹ค.
    double median_anlysis(const vector<Strudent_info>& students)
    {
    	vector<double> grades;
    	transform(students.begin(), students.end(),
    		back_inserter(grades), grade);
    	return median(grades);
    }
     
    transformํ•จˆ˜: ฒ˜Œ2ฐœ˜  „‹ฌธž ฒ”˜˜ ฐ’“ค„ 4ฒˆงธํ•จˆ˜— Œ€ž… ฆฌํ„ฐ’„ 3ฒˆงธ †Œ€„„Œ(?)
    ฌธ œ 
    1. gradeํ•จˆ˜Š” ˜ค„ด”ฉœ ํ•จˆ˜ด€กœ ปดํŒŒŸฌ€  „‹ฌธž ํŒŒ•…ํ•˜€ ชปํ•จ
    2.  œ ํ•˜‚˜„ ‚ด€ •Š€ ํ•™ƒฒฝšฐ ˜คฅ˜ ฐœƒ

    1.2.2.2. ํ•ดฒฐ…

    ƒˆกœšด ํ•จˆ˜ grade_aux ž‘„
    ~cpp 
    double grade_aux(const Student_info& s)
    {
    	try{
    		return grade(s);
    	} catch(domain_error) {
    		return grade(s.midterm, s.final, 0);
    	}
    }
     

    median_anlysisํ•จˆ˜ ˆ˜ •
    ~cpp 
    double median_anlysis(const vector<Strudent_info>& students)
    {
    	vector<double> grades;
    	transform(students.begin(), students.end(),
    		back_inserter(grades), grade_aux);  //grade grade_auxกœ ˆ˜ •
    	return median(grades);
    }
     

    1.2.2.3. write_analysisํ•จˆ˜ ž‘„


    ~cpp 
    void write_analysis(ostream& out, const string& name,
    				double analysis(const vector<Student_info>&),
    				const vector<Student_infor>& did,
    				const vector<Student_infor>& didnt)
    {
    	cout << name << ": median(did) = " << analysis(did) <<
    				", median(didnt) = " << analysis(didnt) << endl;
    }
     

    1.2.2.4. mainํ•จˆ˜


    ~cpp 
    int main()
    {
     // students who did and didn't do all their homework
     vector<Student_info> did, didnt;
     // read the student records and partition them
     Student_info student;
     while (read(cin, student)) {
      if (did_all_hw(student))
       did.push_back(student);
      else 
       didnt.push_back(student);
     }
    	 // verify that the analyses will show us something
     if (did.empty()) {
     cout << "No student did all the homework!" << endl;
      return 1;
     }
     
     if (didnt.empty()) {
     cout << "Every student did all the homework!" << endl;
      return 1;
     }
    
     // do the analyses
     write_analysis(cout, "median", median_analysis, did, didnt);
     write_analysis(cout, "average", average_analysis, did, didnt);
     write_analysis(cout, "median of homework turned in",
                    optimistic_median_analysis, did, didnt);
     return 0;
    }
     

    1.2.3. 6.2.3 Grading based on average homework grade

    ํ‰ท   œ „ — ธฐฐ˜ํ•œ „  „‚ฐ

    1.2.3.1. averageํ•จˆ˜


    ~cpp 
    double average(const vector<double>& v)
    {
    	return accumulate(v.begin(), v.end(), 0.0) / v.size();
    }
     
    accumulateํ•จˆ˜: ฒ˜Œ2ฐœ˜  „‹ฌธž 3ฒˆงธ  „‹ฌธž— ˆ„ ‹œํ‚ด(˜ 0.0Œ€‹  0„ ‚ฌšฉํ•˜ฉด  •ˆ˜กœ ธ‹ †Œˆ˜  €„„ „ ค„)
  • ดํ•จˆ˜ ‚ฌšฉํ•˜ธฐ œ„ํ•ด„œŠ” <numeric>„ include ํ•ดค˜• ํ•œ‹ค.
  • 1.2.3.2. average_gradeํ•จˆ˜


    ~cpp 
    double average_grade(const Student_info& s)
    {
    	return grade(s.midterm, s.final, average(s.homework));
    }
     

    1.2.3.3. average_analysisํ•จˆ˜


    ~cpp 
    double average_analysis(const vector<Student_info>& students)
    {
    	vector<double> grades;
    	transform(students.begin(), students.end(),
    		back_inserter(gardes), aveage_grade);
    	return median(grades);
    }
     

    1.2.4. 6.2.4 Median of the completed homework

    ™„ฃŒœ  œ˜ ค‘•™ ฐ’

    1.2.4.1. optimistic_medianํ•จˆ˜


    ~cpp 
    // s˜ 0ด •„‹Œ š”†Œ“ค˜ ค‘•™ ฐ’, งŒ•ฝ 0ด •„‹Œ š”†Œ€ ํ•˜‚˜„ —†‹คฉด ฒฐŠ” 0ด ฉ‹ˆ‹ค.
    double optimistic_median(const Student_info& s)
    {
    	vector<double> nonzero;
    	remove_copy(s.homework.begin(), s.homework.end(),
    				back_inserter(nonzero), 0);
    	if(nozero.empty())
    		return grade(s.midterm, s.final, 0);
    	else
    		return grade(s.midterm, s.final, median(nonzero));
    }
     

    1.2.4.2. optimistic_median_analysisํ•จˆ˜

    ˆ™ œ„š”..ใ…Žใ…Ž
    AcceleratedC++/Chapter6/Code

    1.3. 6.3 Classifying students, revisited

    5žฅ—„œ ‚ฌšฉํ•œ list ‚ฌšฉํ•˜€ •Šณ , vector ทธŒ€กœ ‚ฌšฉํ•˜—ฌ ทธ™€ „Šทํ•œ „Šฅ˜ •Œณ ฆฌฆ˜

    1.3.1. 6.3.1 A two -pass solution

    ==== extract_fails ํ•จˆ˜====
    ~cpp 
    vector<Student_info> extract_fails(vector<Student_info>& students){
    	vector<Student_info> fail;
    	remove_copy_if(student.begin(), stduents.end(),
    				back_inserter(fail), pgrade);
    	students.erase(remove_if(studens.begin(), students.end(),
    						fgrade), stduents.end());
    	return fail;
    }
     
    remove_copy_ifํ•จˆ˜: ฒ˜Œ 2ฐœ˜  „‹ฌธž ฒ”˜˜ฐ’“ค„ 4ฒˆงธ  „‹ฌธž ํ•จˆ˜ งŒํ•˜€ •ŠŠ” ํ•จˆ˜งŒ 3ฒˆงธ  „‹ฌธž— ณต‚ฌ
    remove_ifํ•จˆ˜: ฒ˜Œ 2ฐœ˜  „‹ฌธž ฒ”œ„˜ ฐ’“คค‘ 3ฒˆงธ  „‹ฌธž งŒํ•˜Š” ํ•จˆ˜ ปจํ…Œด„ˆ˜ ’คกœ ด™. 3ฒˆงธ  „‹ฌธž งŒํ•˜Š” ฐ’ค‘  คฒซงธฐ’„ €ฅด
    eraseฉค„ํ•จˆ˜:ฒ˜Œ 2ฐœ˜  „‹ฌธž ฒ”œ„˜ ฐ’„ €šด‹ค.

    1.3.1.1. pgrade ํ•จˆ˜


    ~cpp 
    bool pgrade(const Student_info& s)
    {
    	return !fgrade(s);
    }
     
    fgradeํ•จˆ˜ ฐ˜ „‹œํ‚จ ํ•จˆ˜

    1.3.2. 6.3.2 A single-pass solution


    ~cpp 
    vector<Student_info> extract_fails(vector<Student_info>& students)
    {
    	vector<Student_info>::iterator iter = 
    		stable_partition(students.begin(), students.end9), pgrade);
    	vector<Student_info> fail(iter, stduents.end());
    	students.erase(iter, students.end());
    
    	return fail;
    }
     
    stable_partition, partition ฐจด ?? ˆœ„œ •ˆฐ”พธ‹ค‹ˆ?? @,.@
    ํ•˜ดํŠ 2ํ•จˆ˜Š” งŒํ•˜€ •ŠŠ” ฐ’˜ ฒซงธ œ„˜ ฆฌํ„
    two-passณด‹ค 2ฐฐ „

    1.4. 6.4 Algorithms, containers, and iterators

    ปจํ…Œด„ˆ™€ •Œณ ฆฌฆ˜˜ €„

    •Œณ ฆฌฆ˜€ ปจํ…Œด„ˆ š”†Œ“ค„ ‹ค‹ˆ‹ค. ฆ‰, ปจํ…Œด„ˆ ‹คฃจŠ” ฒƒด •„‹™‹ˆ‹ค.
    sort, remove_if, partition € ชจ‘ š”†Œ ƒˆกœšด œ„˜กœ ด™‹œํ‚ค€งŒ, ปจํ…Œด„ˆ žฒด˜ †„ธ ํฌธฐ €ฒฝํ•˜€Š” •ŠŠ”‹ค.
    ‚ญ œ ํ•˜ธฐ œ„ํ•ด„œŠ” ‹คŒ ฐ™€ ฐฉ‹œกœ ปจํ…Œด„ˆ˜ ฉ”†Œ“œ ดšฉํ•ด•ํ•œ‹ค.
    ~cpp v.erase(remove_if(students.begin(), students.end(), fgrade), students.end());

    ปจํ…Œด„ˆ™€ ฐ˜ณตž˜ €„
    partiton, remove_if, erase, insert™€ ฐ™€ —ฐ‚ฐ€ eraseœ ฐ˜ณตž ฌดํšจํ™”‹œํ‚จ‹ค.
    ”ฐ„œ  €žฅœ ฐ˜ณตž— €ํ•ด„œ ํ”„กœทธž˜ฐ„ ํ•˜ฉด„œ กฐ‹ฌํ•ด•ํ•  ํ•„š”€ žˆ‹ค.
    ”ฐ„œ ƒธฐ™€ ฐ™€ ํ•จˆ˜ ดšฉํ•œ ’ค—Š” ด „— ํ• ‹œ ฐ˜ณตž€ œ ํšจํ•˜‹คณ  ณดณ  ํ”„กœทธžจ˜ กœง„ งŒ“ค–ด„œŠ” •ˆœ‹ค.

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