<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=AcceleratedC%2B%2B%2FChapter6</id>
	<title>AcceleratedC++/Chapter6 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=AcceleratedC%2B%2B%2FChapter6"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter6&amp;action=history"/>
	<updated>2026-05-14T14:00:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter6&amp;diff=84053&amp;oldid=prev</id>
		<title>Maintenance script: Repair batch-0001 pages from live compare</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter6&amp;diff=84053&amp;oldid=prev"/>
		<updated>2026-03-26T23:56:00Z</updated>

		<summary type="html">&lt;p&gt;Repair batch-0001 pages from live compare&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:56, 26 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l148&quot;&gt;Line 148:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 148:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // `beg&amp;#039; marks the beginning of the protocol-name&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // `beg&amp;#039; marks the beginning of the protocol-name&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     iter beg = i;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     iter beg = i;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     while (beg != b &amp;amp;amp;&amp;amp;amp; isalpha(beg&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;-1&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;))&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     while (beg != b &amp;amp;amp;&amp;amp;amp; isalpha(beg&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;-1&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;))&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      --beg; //protocol-typed의 위치에 존재하는 문자열이 조건에 맞을 경우 앞으로 한칸씩 움직이면서 검사한다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      --beg; //protocol-typed의 위치에 존재하는 문자열이 조건에 맞을 경우 앞으로 한칸씩 움직이면서 검사한다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // is there at least one appropriate character before and after the separator?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // is there at least one appropriate character before and after the separator?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if (beg != i &amp;amp;amp;&amp;amp;amp; !not_url_char(i&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;sep.size()&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;))&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if (beg != i &amp;amp;amp;&amp;amp;amp; !not_url_char(i&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;sep.size()&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;))&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      return beg;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      return beg;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l304&quot;&gt;Line 304:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 304:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  accumulate함수: 처음2개의 전달인자를 3번째 전달인자에 누적시킴(주의 0.0대신 0을 사용하면 정수로 인식 소수점 부분을 버려버림)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  accumulate함수: 처음2개의 전달인자를 3번째 전달인자에 누적시킴(주의 0.0대신 0을 사용하면 정수로 인식 소수점 부분을 버려버림)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 이함수를 사용하기 위해서는 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;lt;&lt;/del&gt;numeric&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;gt;&lt;/del&gt;을 include 해줘야 한다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 이함수를 사용하기 위해서는 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;&lt;/ins&gt;numeric&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;gt;&lt;/ins&gt;을 include 해줘야 한다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  ==== average_grade함수 ====&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  ==== average_grade함수 ====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  double average_grade(const Student_info&amp;amp;amp; s)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  double average_grade(const Student_info&amp;amp;amp; s)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l386&quot;&gt;Line 386:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 386:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    sort, remove_if, partition 은 모두 요소를 새로운 위치로 이동시키지만, 컨테이너 자체의 속성인 크기를 변경하지는 않는다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    sort, remove_if, partition 은 모두 요소를 새로운 위치로 이동시키지만, 컨테이너 자체의 속성인 크기를 변경하지는 않는다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    삭제를 하기 위해서는 다음과 같은 방식으로 컨테이너의 메소드를 이용해야한다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    삭제를 하기 위해서는 다음과 같은 방식으로 컨테이너의 메소드를 이용해야한다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; ~cpp &lt;/del&gt;v.erase(remove_if(students.begin(), students.end(), fgrade), students.end());&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;code&amp;gt;&lt;/ins&gt;v.erase(remove_if(students.begin(), students.end(), fgrade), students.end());&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/code&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &amp;#039;&amp;#039;컨테이너와 반복자의 관계&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &amp;#039;&amp;#039;컨테이너와 반복자의 관계&amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l395&quot;&gt;Line 395:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 395:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[AcceleratedC++]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[AcceleratedC++]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter6&amp;diff=27499&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:22, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter6&amp;diff=27499&amp;oldid=prev"/>
		<updated>2021-02-07T05:22:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[AcceleratedC++/Chapter5]]&lt;br /&gt;
| [[AcceleratedC++/Chapter7]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Chapter 6 Using Library Algorithms =&lt;br /&gt;
* 5장에서 본것처럼 우리가 다루는 컨테이너들은 내부 사정은 다를지라도, 우리는 그것을 모르고도 똑같이 쓸 수가 있다. 즉 일관된 인터페이스를 제공한다는 것이다. 컨테이너나 반복자와 마찬가지로 표준 라이브러리도 일관된 인터페이스를 제공한다. 벡터를 배웠으면 리스트도 금방 쓸수 있는 것처럼, 하나의 알고리즘 쓰는 법을 배우면, 다른 것 쓰는 법도 금방 알수가 있다.&lt;br /&gt;
 == 6.1 Analyzing strings ==&lt;br /&gt;
** Chapter5의 마지막에 루프를 줄인 다음과 같은 구문이 있었다. ret의 끝에다가 bottom의 처음부터 끝까지 넣는다는 뜻이다.&lt;br /&gt;
 ret.insert(ret.end(), bottom,begin(), bottom.end());&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
** 근데 이것보다 더 일반적인, (즉 컨테이너에 독립적인) 방법이 있다. 컨테이너의 멤버함수를 이용하는 것이 아닌, 표준 알고리즘을 이용하는 것이다. 위의 것과 동일한 기능을 한다.&lt;br /&gt;
 copy(bottom.begin(), bottom.end(), back_inserter(ret));&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
** 음. 또 새로운 것이 보이지 않는가? copy는 generic algorithm의 예이고, back_inserter는 반복자 어댑터의 예이다. 이게 무엇인지는 차근차근 살펴보도록 하자.&lt;br /&gt;
** Generic algorithm이라는 컨테이너의 부분이 아닌 알고리즘이다. 파라메터로 반복자를 받는다. 비슷하지 않은가? .이 없다 뿐이지 그냥 쓰자.&lt;br /&gt;
** Postfix와 Prefix : i++과 ++i의 차이점이다. ++i는 i를 사용하기 전에 값을 증가시키고, i++은 i를 사용한 후에 값을 증가시킨다.&lt;br /&gt;
** 다음으로 반복자 어댑터(Iterator Adapters)를 살펴보자. 반복자 어댑터는 컨테이너를 인자로 받아, 정해진 작업을 수행하고 반복자를 리턴해주는 함수이다. copy알고리즘에 쓰인 back_inserter는 ret의 뒤에다가 copy를 수행한다는 것이다. 그럼 다음과 같이 쓰고 싶은 사람도 있을 것이다.&lt;br /&gt;
 copy(bottom.begin(), bottom.end(), ret.end());&lt;br /&gt;
   &lt;br /&gt;
** 앞에서도 말했지만, end()에는 아무것도 없다.&lt;br /&gt;
** 왜 이렇게 설계했는가? 프로그래머로 하여금 쓰고 싶은 연산을 골라서 쓸수 있게 하기 때문이다.&lt;br /&gt;
&lt;br /&gt;
  === 6.1.1 Another way to split ===&lt;br /&gt;
** 5장에서 공부한 것 중에 주어진 string을 공백을 기준으로 잘라서, vector에다 넣은 다음 리턴해주는 함수가 있었다.(split) 이것을 좀 더 간단히 만들어보자. 앞의 것은 굉장히 알아보기 힘들게 되어있다.&lt;br /&gt;
 vector&amp;amp;lt;string&amp;amp;gt; split(const string&amp;amp;amp; str)&lt;br /&gt;
 {&lt;br /&gt;
  typedef string::const_iterator iter;&lt;br /&gt;
  vector&amp;amp;lt;string&amp;amp;gt; ret;&lt;br /&gt;
  iter i = str.begin();&lt;br /&gt;
  while(i != str.end()) {&lt;br /&gt;
   i = find_if(i, str.end(), not_space); // 공백이 아닌 부분을 찾고&lt;br /&gt;
   iter j = find_if(i, str.end(), space); // 공백인 부분을 찾아서&lt;br /&gt;
   if(i != str.end())&lt;br /&gt;
    ret.push_back(string(i,j)); // 그만큼의 문자열엘 벡터에 넣음&lt;br /&gt;
   i = j;&lt;br /&gt;
  }&lt;br /&gt;
  return ret;&lt;br /&gt;
 }&lt;br /&gt;
   &lt;br /&gt;
** 훨씬 알아보기 쉬워졌다. 5장의 split은 find_if마다 열심히 루프를 돌렸었다. 이제 차근차근 살펴보자.&lt;br /&gt;
** find_if의 인자를 보면, 앞의 두개의 인자는 범위를 의미한다. 첫인자~두번째인자 말이다. 마지막 인자는 bool형을 리턴하는 함수를 넣어준다. 즉 predicater이다. 그러면 find_if는 주어진 범위 내에서 predicator를 만족하는 부분의 반복자를 리턴해 준다.&lt;br /&gt;
** isspace는 표준 라이브러리에서 지원하는 함수임에다 불구하고, 왜 따로 만들었을까? 바로 isspace는 여러 언어 버젼으로 오버로딩 되어 있기 때문이다. 템플릿 함수의 인자로 오버로딩된 함수를 넘겨주는 것은 쉽지 않다. 어떤 버젼인지 알수가 없기 때문이다. 이것이 우리가 isspace역할을 하는 함수를 새로 만든 이유다.&lt;br /&gt;
** 5장에서는 string(i,j) 대신에, substr이라는 함수를 이용했었는데, 이번에 쓰지 않은 이유는 substr은 반복자를 인자로 받지 않기 &amp;amp;#46468;문이다.&lt;br /&gt;
** 또한 제네릭 알고리즘은 end()를 깔끔하게 처리해준다. 우리가 신경안써도 된다는 것이다.&lt;br /&gt;
&lt;br /&gt;
  === 6.1.2 Palindromes ===&lt;br /&gt;
** Palindrome이란 앞에서부터 읽어도 뒤에서부터 읽어도 똑같은 단어를 의미한다.&lt;br /&gt;
 bool isPalindrome(const string&amp;amp;amp; s)&lt;br /&gt;
 {&lt;br /&gt;
  return equal(s.begin(), s.end(), s.rbegin());&lt;br /&gt;
 }&lt;br /&gt;
   &lt;br /&gt;
** 참 깔끔하다. rbegin()은 역시 반복자를 리턴해주는 함수이다. 거꾸로 간다. equal함수는 두개의 구간을 비교해서 같을 경우 bool 의 true 값을 리턴한다. 파라매터로 첫번째 구간의 시작과 끝, 두번째 구간의 시작 iterator 를 받는다. 두번째 구간의 끝을 나타내는 iterator 를 요구하지 않는 이유는, 두개의 구간의 길이가 같다고 가정하기 때문이다. 이는 equal 함수의 동작을 생각해 볼때 합당한 처리이다.&lt;br /&gt;
  === 6.1.3 Finding URL ===&lt;br /&gt;
 #ifndef GUARD_urls_h&lt;br /&gt;
 #define GUARD_urls_h&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 std::vector&amp;amp;lt;std::string&amp;amp;gt; find_urls(const std::string&amp;amp;amp; s);&lt;br /&gt;
 #endif&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;cctype&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 #include &amp;quot;urls.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 using std::find;&lt;br /&gt;
 using std::find_if;&lt;br /&gt;
 using std::isalnum;&lt;br /&gt;
 using std::isalpha;&lt;br /&gt;
 using std::isdigit;&lt;br /&gt;
 using std::search;&lt;br /&gt;
 using std::string;&lt;br /&gt;
 using std::vector;&lt;br /&gt;
 &lt;br /&gt;
 bool not_url_char(char);&lt;br /&gt;
 string::const_iterator url_end(string::const_iterator, string::const_iterator);&lt;br /&gt;
 string::const_iterator url_beg(string::const_iterator, string::const_iterator);&lt;br /&gt;
 &lt;br /&gt;
 vector&amp;amp;lt;string&amp;amp;gt; find_urls(const string&amp;amp;amp; s)&lt;br /&gt;
 {&lt;br /&gt;
  vector&amp;amp;lt;string&amp;amp;gt; ret;&lt;br /&gt;
  typedef string::const_iterator iter;&lt;br /&gt;
  iter b = s.begin(), e = s.end();&lt;br /&gt;
 &lt;br /&gt;
  // look through the entire input&lt;br /&gt;
  while (b != e) {&lt;br /&gt;
   // look for one or more letters followed by `://&amp;#039;&lt;br /&gt;
   b = url_beg(b, e);&lt;br /&gt;
   // if we found it&lt;br /&gt;
   if (b != e) {&lt;br /&gt;
    // get the rest of the \s-1URL\s0&lt;br /&gt;
    iter after = url_end(b, e);&lt;br /&gt;
    // remember the \s-1URL\s0&lt;br /&gt;
    ret.push_back(string(b, after));&lt;br /&gt;
    // advance `b&amp;#039; and check for more \s-1URL\s0s on this line&lt;br /&gt;
    b = after;&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
  return ret;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 string::const_iterator url_end(string::const_iterator b, string::const_iterator e)&lt;br /&gt;
 {&lt;br /&gt;
  return find_if(b, e, not_url_char);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // find_if 함수의 테스팅에 이용되는 함수이다. char은 string 의 iterator의 값이다.&lt;br /&gt;
 bool not_url_char(char c)&lt;br /&gt;
 {&lt;br /&gt;
  // characters, in addition to alphanumerics, that can appear in a \s-1URL\s0&lt;br /&gt;
  static const string url_ch = &amp;quot;~;/?:@=&amp;amp;amp;$-_.+!*&amp;#039;(),&amp;quot;;&lt;br /&gt;
  // see whether `c&amp;#039; can appear in a \s-1URL\s0 and return the negative&lt;br /&gt;
  return !(isalnum(c) ||&lt;br /&gt;
           find(url_ch.begin(), url_ch.end(), c) != url_ch.end());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 //이 예제의 핵심 함수이다.&lt;br /&gt;
 string::const_iterator url_beg(string::const_iterator b, string::const_iterator e)&lt;br /&gt;
 {&lt;br /&gt;
  /*&lt;br /&gt;
   b 는 protocol type의 시작위치를 가르키게된다.&lt;br /&gt;
   i 는 :// 의 시작 위치를 가리키는 역할을 한다.&lt;br /&gt;
   e 는 url의 마지막 텍스트를 가리키는 역할을 한다.&lt;br /&gt;
   */&lt;br /&gt;
  static const string sep = &amp;quot;://&amp;quot;;&lt;br /&gt;
  typedef string::const_iterator iter;&lt;br /&gt;
 &lt;br /&gt;
  // `i&amp;#039; marks where the separator was found&lt;br /&gt;
  iter i = b;&lt;br /&gt;
 &lt;br /&gt;
  // string 에서 sep 의 문자열의 시작부분을 찾아서 i에 iterator를 대입한 후 e와 비교하여&lt;br /&gt;
  // 같지 않으면 실행한다. (즉, sep를 찾았을 경우)&lt;br /&gt;
  while ((i = search(i, e, sep.begin(), sep.end())) != e) {&lt;br /&gt;
   // make sure the separator isn&amp;#039;t at the beginning or end of the line&lt;br /&gt;
   if (i != b &amp;amp;amp;&amp;amp;amp; i + sep.size() != e) {&lt;br /&gt;
    // `beg&amp;#039; marks the beginning of the protocol-name&lt;br /&gt;
    iter beg = i;&lt;br /&gt;
    while (beg != b &amp;amp;amp;&amp;amp;amp; isalpha(beg[-1]))&lt;br /&gt;
     --beg; //protocol-typed의 위치에 존재하는 문자열이 조건에 맞을 경우 앞으로 한칸씩 움직이면서 검사한다.&lt;br /&gt;
    // is there at least one appropriate character before and after the separator?&lt;br /&gt;
    if (beg != i &amp;amp;amp;&amp;amp;amp; !not_url_char(i[sep.size()]))&lt;br /&gt;
     return beg;&lt;br /&gt;
   }&lt;br /&gt;
   // the separator we found wasn&amp;#039;t part of a \s-1URL\s0; advance `i&amp;#039; past this separator&lt;br /&gt;
   i += sep.size();&lt;br /&gt;
  }&lt;br /&gt;
  return e;&lt;br /&gt;
 }&lt;br /&gt;
   &lt;br /&gt;
** 이 예제는 string STL을 이용해서 문자열을 검색하고, 우리에게 맞는 정보를 가공하는 것이 목적이다.&lt;br /&gt;
** protocol-type://domainname 의 형태를 검사한다.&lt;br /&gt;
** search(b, e, b2, e3) [b, e)의 문자열 시퀀스에서 [b2, e3) 문자열 시퀀스를 찾는다.&lt;br /&gt;
** find(b, e, t) 문자열 시퀀스 [b, e)에서 값 t를 찾는다.&lt;br /&gt;
** find_if(b, e, p) 문자열 시퀀스 [b, e)에서 함수 p를 통해 테스트한다.&lt;br /&gt;
** static 스토리지 지정자는 함수의 최초 생성시 저장공간에 단 한번만 할당되며, 다시 호출을 하여도 새로 할당되지 않는다.&lt;br /&gt;
&lt;br /&gt;
 == 6.2 Comparing grading schemes ==&lt;br /&gt;
  Chapter 4.2에서 제시된 중앙값을 이용한 방식으로 성적을 계산할 경우 악의적으로&lt;br /&gt;
  과제물을 제출하지 않는 학생의 발생이 염려된다.&lt;br /&gt;
  과연 어느 정도로 결과에 영향을 주는지 실제로 프로그램을 작성하여 확인해본다.&lt;br /&gt;
## 중앙값 대신 평균을 사용하며, 제출하지 않은 과제에는 0점을 주는 방식(6.2.3)&lt;br /&gt;
## 실제로 제출한 과제에 대해서만 중앙값을 적용하는 방법(6.2.4)&lt;br /&gt;
## 중앙값을 이용하여 평균을 이용(6.2.2)&lt;br /&gt;
 &lt;br /&gt;
 이를 위한 세부작업&lt;br /&gt;
## 모든 학생의 레코드를 읽어들여, 모든 과제를 제출한 학생들과 그렇지 않은 학생들을 구분합니다.(6.2.1)&lt;br /&gt;
## 두 계산법을(위의1,2를 의미, 3도 포함해야할듯..@,.@) 각 그룹의 모든 학생들에게 각각 적용하고, 각 그룹의 중앙 값을 출력합니다.(6.2.2)&lt;br /&gt;
&lt;br /&gt;
 === 6.2.1 Working with student records ===&lt;br /&gt;
&lt;br /&gt;
 ==== 모든 과제를 제출했는지를 판별하는 함수 ====&lt;br /&gt;
   bool did_all_hw(const Student_info&amp;amp;amp; s)&lt;br /&gt;
   {&lt;br /&gt;
   	return ((find(s.homework.begin(), s.homework.end(), 0)) ==&lt;br /&gt;
   		s.homework.end());&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
 find함수는 처음두개의 전달인자 범위에서 세번째 전달인자의 값을 찾지 못하면 2번째 전달인자를 리턴한다. (찾으면 첫번째전달인자   &lt;br /&gt;
 를 리턴한다던데...@,.@잘못된거 아닌가??) 고로 찾지못하면 s.homework.begin() == s.homework.begin()이 되므로 true를 리턴함&lt;br /&gt;
&lt;br /&gt;
 ==== 학생 레코드를 읽고 분류하는 코드 ====&lt;br /&gt;
   vector&amp;amp;lt;Student_info&amp;amp;gt; did, didnt;&lt;br /&gt;
   // read the student records and partition them&lt;br /&gt;
   Student_info student;&lt;br /&gt;
   while (read(cin, student)) {&lt;br /&gt;
    if (did_all_hw(student))&lt;br /&gt;
     did.push_back(student);&lt;br /&gt;
    else &lt;br /&gt;
     didnt.push_back(student);&lt;br /&gt;
   }&lt;br /&gt;
  	 // verify that the analyses will show us something&lt;br /&gt;
   if (did.empty()) {&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; &amp;quot;No student did all the homework!&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
    return 1;&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   if (didnt.empty()) {&lt;br /&gt;
   cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Every student did all the homework!&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
    return 1;&lt;br /&gt;
   } &lt;br /&gt;
  &lt;br /&gt;
 empty멤버함수: 컨테이너가 비어 있으면 true, 아니면 false리턴&lt;br /&gt;
   &lt;br /&gt;
 === 6.2.2 Analyzing the grades ===&lt;br /&gt;
 ==== 초기 median_analysis 함수 ====&lt;br /&gt;
 // 이 함수는 제대로 동작하지 않습니다.&lt;br /&gt;
 double median_anlysis(const vector&amp;amp;lt;Strudent_info&amp;amp;gt;&amp;amp;amp; students)&lt;br /&gt;
 {&lt;br /&gt;
 	vector&amp;amp;lt;double&amp;amp;gt; grades;&lt;br /&gt;
 	transform(students.begin(), students.end(),&lt;br /&gt;
 		back_inserter(grades), grade);&lt;br /&gt;
 	return median(grades);&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 transform함수: 처음2개의 전달인자 범의의 값들을 4번째함수에 대입 리턴값을 3번째 주소부터 넣음(?)&lt;br /&gt;
 문제점&lt;br /&gt;
# grade함수는 오버라이딩된 함수이므로 컴파일러가 전달인자를 파악하지 못함&lt;br /&gt;
# 과제를 하나도 내지 않은 학생일경우 오류 발생&lt;br /&gt;
 ==== 해결책 ====&lt;br /&gt;
 새로운 함수 grade_aux 작성&lt;br /&gt;
 double grade_aux(const Student_info&amp;amp;amp; s)&lt;br /&gt;
 {&lt;br /&gt;
 	try{&lt;br /&gt;
 		return grade(s);&lt;br /&gt;
 	} catch(domain_error) {&lt;br /&gt;
 		return grade(s.midterm, s.final, 0);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 median_anlysis함수 수정&lt;br /&gt;
 double median_anlysis(const vector&amp;amp;lt;Strudent_info&amp;amp;gt;&amp;amp;amp; students)&lt;br /&gt;
 {&lt;br /&gt;
 	vector&amp;amp;lt;double&amp;amp;gt; grades;&lt;br /&gt;
 	transform(students.begin(), students.end(),&lt;br /&gt;
 		back_inserter(grades), grade_aux);  //grade를 grade_aux로 수정&lt;br /&gt;
 	return median(grades);&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 ==== write_analysis함수 작성 ====&lt;br /&gt;
 void write_analysis(ostream&amp;amp;amp; out, const string&amp;amp;amp; name,&lt;br /&gt;
 				double analysis(const vector&amp;amp;lt;Student_info&amp;amp;gt;&amp;amp;amp;),&lt;br /&gt;
 				const vector&amp;amp;lt;Student_infor&amp;amp;gt;&amp;amp;amp; did,&lt;br /&gt;
 				const vector&amp;amp;lt;Student_infor&amp;amp;gt;&amp;amp;amp; didnt)&lt;br /&gt;
 {&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; name &amp;amp;lt;&amp;amp;lt; &amp;quot;: median(did) = &amp;quot; &amp;amp;lt;&amp;amp;lt; analysis(did) &amp;amp;lt;&amp;amp;lt;&lt;br /&gt;
 				&amp;quot;, median(didnt) = &amp;quot; &amp;amp;lt;&amp;amp;lt; analysis(didnt) &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 ==== main함수 ====&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
  // students who did and didn&amp;#039;t do all their homework&lt;br /&gt;
  vector&amp;amp;lt;Student_info&amp;amp;gt; did, didnt;&lt;br /&gt;
  // read the student records and partition them&lt;br /&gt;
  Student_info student;&lt;br /&gt;
  while (read(cin, student)) {&lt;br /&gt;
   if (did_all_hw(student))&lt;br /&gt;
    did.push_back(student);&lt;br /&gt;
   else &lt;br /&gt;
    didnt.push_back(student);&lt;br /&gt;
  }&lt;br /&gt;
 	 // verify that the analyses will show us something&lt;br /&gt;
  if (did.empty()) {&lt;br /&gt;
  cout &amp;amp;lt;&amp;amp;lt; &amp;quot;No student did all the homework!&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
   return 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (didnt.empty()) {&lt;br /&gt;
  cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Every student did all the homework!&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
   return 1;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // do the analyses&lt;br /&gt;
  write_analysis(cout, &amp;quot;median&amp;quot;, median_analysis, did, didnt);&lt;br /&gt;
  write_analysis(cout, &amp;quot;average&amp;quot;, average_analysis, did, didnt);&lt;br /&gt;
  write_analysis(cout, &amp;quot;median of homework turned in&amp;quot;,&lt;br /&gt;
                 optimistic_median_analysis, did, didnt);&lt;br /&gt;
  return 0;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 === 6.2.3 Grading based on average homework grade ===&lt;br /&gt;
 평균 과제 성적에 기반한 성적 계산&lt;br /&gt;
 ==== average함수 ====&lt;br /&gt;
 double average(const vector&amp;amp;lt;double&amp;amp;gt;&amp;amp;amp; v)&lt;br /&gt;
 {&lt;br /&gt;
 	return accumulate(v.begin(), v.end(), 0.0) / v.size();&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 accumulate함수: 처음2개의 전달인자를 3번째 전달인자에 누적시킴(주의 0.0대신 0을 사용하면 정수로 인식 소수점 부분을 버려버림)&lt;br /&gt;
* 이함수를 사용하기 위해서는 &amp;amp;lt;numeric&amp;amp;gt;을 include 해줘야 한다.&lt;br /&gt;
 ==== average_grade함수 ====&lt;br /&gt;
 double average_grade(const Student_info&amp;amp;amp; s)&lt;br /&gt;
 {&lt;br /&gt;
 	return grade(s.midterm, s.final, average(s.homework));&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 ==== average_analysis함수 ====&lt;br /&gt;
 double average_analysis(const vector&amp;amp;lt;Student_info&amp;amp;gt;&amp;amp;amp; students)&lt;br /&gt;
 {&lt;br /&gt;
 	vector&amp;amp;lt;double&amp;amp;gt; grades;&lt;br /&gt;
 	transform(students.begin(), students.end(),&lt;br /&gt;
 		back_inserter(gardes), aveage_grade);&lt;br /&gt;
 	return median(grades);&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 === 6.2.4 Median of the completed homework ===&lt;br /&gt;
 완료된 과제의 중앙 값&lt;br /&gt;
 ==== optimistic_median함수 ====&lt;br /&gt;
 // s의 0이 아닌 요소들의 중앙 값, 만약 0이 아닌 요소가 하나도 없다면 결과는 0이 됩니다.&lt;br /&gt;
 double optimistic_median(const Student_info&amp;amp;amp; s)&lt;br /&gt;
 {&lt;br /&gt;
 	vector&amp;amp;lt;double&amp;amp;gt; nonzero;&lt;br /&gt;
 	remove_copy(s.homework.begin(), s.homework.end(),&lt;br /&gt;
 				back_inserter(nonzero), 0);&lt;br /&gt;
 	if(nozero.empty())&lt;br /&gt;
 		return grade(s.midterm, s.final, 0);&lt;br /&gt;
 	else&lt;br /&gt;
 		return grade(s.midterm, s.final, median(nonzero));&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 ==== optimistic_median_analysis함수 ====&lt;br /&gt;
 숙제라네요..ㅎㅎ&lt;br /&gt;
 [[AcceleratedC++/Chapter6/Code]]&lt;br /&gt;
 == 6.3 Classifying students, revisited ==&lt;br /&gt;
 5장에서 사용한 list를 사용하지 않고, vector를 그대로 사용하여 그와 비슷한 성능의 알고리즘&lt;br /&gt;
&lt;br /&gt;
 === 6.3.1 A two -pass solution ===&lt;br /&gt;
 ==== extract_fails 함수====&lt;br /&gt;
 vector&amp;amp;lt;Student_info&amp;amp;gt; extract_fails(vector&amp;amp;lt;Student_info&amp;amp;gt;&amp;amp;amp; students){&lt;br /&gt;
 	vector&amp;amp;lt;Student_info&amp;amp;gt; fail;&lt;br /&gt;
 	remove_copy_if(student.begin(), stduents.end(),&lt;br /&gt;
 				back_inserter(fail), pgrade);&lt;br /&gt;
 	students.erase(remove_if(studens.begin(), students.end(),&lt;br /&gt;
 						fgrade), stduents.end());&lt;br /&gt;
 	return fail;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 remove_copy_if함수: 처음 2개의 전달인자 범의의값들을 4번째 전달인자 함수를 만족하지 않는 함수만 3번째 전달인자에 복사&lt;br /&gt;
 remove_if함수: 처음 2개의 전달인자 범위의 값들중 3번째 전달인자를 만족하는 함수를 컨테이너의 뒤로 이동. 3번째 전달인자를 만족하는 값중 젤첫째값을 가르침&lt;br /&gt;
 erase멤버함수:처음 2개의 전달인자 범위의 값을 지운다.&lt;br /&gt;
 &lt;br /&gt;
 ==== pgrade 함수 ====&lt;br /&gt;
 bool pgrade(const Student_info&amp;amp;amp; s)&lt;br /&gt;
 {&lt;br /&gt;
 	return !fgrade(s);&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 fgrade함수를 반전시킨 함수&lt;br /&gt;
&lt;br /&gt;
 === 6.3.2 A single-pass solution ===&lt;br /&gt;
 vector&amp;amp;lt;Student_info&amp;amp;gt; extract_fails(vector&amp;amp;lt;Student_info&amp;amp;gt;&amp;amp;amp; students)&lt;br /&gt;
 {&lt;br /&gt;
 	vector&amp;amp;lt;Student_info&amp;amp;gt;::iterator iter = &lt;br /&gt;
 		stable_partition(students.begin(), students.end9), pgrade);&lt;br /&gt;
 	vector&amp;amp;lt;Student_info&amp;amp;gt; fail(iter, stduents.end());&lt;br /&gt;
 	students.erase(iter, students.end());&lt;br /&gt;
 &lt;br /&gt;
 	return fail;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 stable_partition, partition 차이점?? 순서를 안바꾸다니?? @,.@&lt;br /&gt;
 하이튼 2함수는 만족하지 않는 값의 첫째 위치를 리턴&lt;br /&gt;
 two-pass보다 2배빠름&lt;br /&gt;
 == 6.4 Algorithms, containers, and iterators ==&lt;br /&gt;
   &amp;#039;&amp;#039;컨테이너와 알고리즘의 관계&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;알고리즘은 컨테이너 요소들을 다룹니다. 즉, 컨테이너를 다루는 것이 아닙니다.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   sort, remove_if, partition 은 모두 요소를 새로운 위치로 이동시키지만, 컨테이너 자체의 속성인 크기를 변경하지는 않는다.&lt;br /&gt;
   삭제를 하기 위해서는 다음과 같은 방식으로 컨테이너의 메소드를 이용해야한다.&lt;br /&gt;
 ~cpp v.erase(remove_if(students.begin(), students.end(), fgrade), students.end());&lt;br /&gt;
&lt;br /&gt;
   &amp;#039;&amp;#039;컨테이너와 반복자의 관계&amp;#039;&amp;#039;&lt;br /&gt;
   partiton, remove_if, erase, insert와 같은 연산은 erase된 반복자를 무효화시킨다.&lt;br /&gt;
   따라서 저장된 반복자에 관해서 프로그래밍을 하면서 조심해야할 필요가 있다.&lt;br /&gt;
   따라서 상기와 같은 함수를 이용한 뒤에는 이전에 할당된 반복자가 유효하다고 보고 프로그램의 로직을 만들어서는 안된다.   &lt;br /&gt;
   &lt;br /&gt;
----&lt;br /&gt;
[[AcceleratedC++]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>