<?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%2FChapter8</id>
	<title>AcceleratedC++/Chapter8 - 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%2FChapter8"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AcceleratedC%2B%2B/Chapter8&amp;action=history"/>
	<updated>2026-05-14T14:00:14Z</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/Chapter8&amp;diff=84055&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/Chapter8&amp;diff=84055&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-l49&quot;&gt;Line 49:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 49:&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;  	vec_sz mid = size/2;&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;  	vec_sz mid = size/2;&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;  	return size % 2 == 0 ? (v&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;mid&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;] &lt;/del&gt;+ v&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;mid-1&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;) / 2 : v&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;mid&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;;	// double, int에는 유효, string은 operator / 가 없기 때문에 무효&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;  	return size % 2 == 0 ? (v&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;mid&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93; &lt;/ins&gt;+ v&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;mid-1&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;) / 2 : v&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;mid&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#93;&lt;/ins&gt;;	// double, int에는 유효, string은 operator / 가 없기 때문에 무효&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;&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;  #endif&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;  #endif&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-l71&quot;&gt;Line 71:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 71:&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;| D의 인자의 형을 기준으로 [B, E)를 비교하여 값을 모은다. 리턴값이 D의 자료형에 영향을 받기 때문에 문제의 발생소지가 존재한다.&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;| D의 인자의 형을 기준으로 [B, E)를 비교하여 값을 모은다. 리턴값이 D의 자료형에 영향을 받기 때문에 문제의 발생소지가 존재한다.&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;ex) accumulate(v.begin(), v.end(), 0.0); // 만약 0:int를 사용했다면 올바른 동작을 보장할 수 없다.&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;ex) accumulate(v.begin(), v.end(), 0.0); // 만약 0:int를 사용했다면 올바른 동작을 보장할 수 없다.&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;max 함수의 구현&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;max 함수의 구현&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-l240&quot;&gt;Line 240:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 240:&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 j = find_if(i, str.end(), space);&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 j = find_if(i, str.end(), space);&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;  		// copy the characters in `&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/del&gt;i,&amp;#039; `j)&amp;#039;&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;  		// copy the characters in `&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;#91;&lt;/ins&gt;i,&amp;#039; `j)&amp;#039;&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;  		if (i != str.end())&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;  		if (i != str.end())&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;  			*os++ = string(i, j);   // changed&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;  			*os++ = string(i, j);   // changed&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-l250&quot;&gt;Line 250:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 250:&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/Chapter8&amp;diff=27502&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/Chapter8&amp;diff=27502&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++/Chapter7]]&lt;br /&gt;
| [[AcceleratedC++/Chapter9]]&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 8 Writing generic functions =&lt;br /&gt;
WikiPedia:Generic_function : 함수를 호출하기 전까지는 그 함수의 매개변수 타입이 무엇인지 알 수 없는 함수.&lt;br /&gt;
Ch9~Ch12 WikiPedia:Abstract_data_type (이하 ADT)의 구현을 공부한다.&lt;br /&gt;
참고페이지) [[ParametricPolymorphism]]&lt;br /&gt;
&lt;br /&gt;
== 8.1 What is a generic function? ==&lt;br /&gt;
WikiPedia:Generic_function : 함수의 호출시 인자 타입이나 리턴타입을 사용자가 알 수없다. ex)find(B,E,D)&lt;br /&gt;
함수의 호출시 함수의 매개변수를 operand로 하여 행해지는 operator의 유효성을 컴파일러가 조사. 사용 가능성을 판단&lt;br /&gt;
   union(A:string, &amp;quot; is...&amp;quot;) (O), concaternate(&amp;quot;COL&amp;quot;, &amp;quot; is...&amp;quot;) (X)&lt;br /&gt;
그렇다면 어떻게 함수가 어떠한 자료구조를 만족 시키는지 판단할 수 있는가?&lt;br /&gt;
반복자를 생각해보자. 만약 특정 자료구조가 반복자를 리턴하는 멤버함수를 갖는 다면 반복자를 인자로 받는 function들에 대해서 그 자료구조는 유효하다고 판단할 수 있다.&lt;br /&gt;
 === 8.1.1 알려지지 않은 타입의 중앙 값 ===&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;template&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
  서로 다른 타입의 객체이라도 하더라도 각각의 객체를 가지고 행하는 행동양식은 공통의 행동양식을 갖는다.&lt;br /&gt;
  Runtime이 아니라 Compile 타임에 실제로 타입이 변화하는 객체를 적절히 작성하면 올바른 동작을 보장한다.&lt;br /&gt;
 //median.h&lt;br /&gt;
 #ifndef GUARD_median_h&lt;br /&gt;
 #define GUARD_median_h&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdexcept&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 using std::domain_error;&lt;br /&gt;
 using std::sort;&lt;br /&gt;
 using std::vector;&lt;br /&gt;
 template &amp;amp;lt;class T&amp;amp;gt; 	// type 매개변수의 지정, 이 함수의 scope안에서는 데이터 형을 대신한다.&lt;br /&gt;
 T median(vector&amp;amp;lt;T&amp;amp;gt; v)&lt;br /&gt;
 {&lt;br /&gt;
 	typedef typename vector&amp;amp;lt;T&amp;amp;gt;::size_type vec_sz; 	// typename에 대해서 알자&lt;br /&gt;
 &lt;br /&gt;
 	vec_sz size = v.size();&lt;br /&gt;
 	if (size == 0)&lt;br /&gt;
 		throw domain_error(&amp;quot;median of an empty vector&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 	sort(v.begin(), v.end());&lt;br /&gt;
 &lt;br /&gt;
 	vec_sz mid = size/2;&lt;br /&gt;
 &lt;br /&gt;
 	return size % 2 == 0 ? (v[mid] + v[mid-1]) / 2 : v[mid];	// double, int에는 유효, string은 operator / 가 없기 때문에 무효&lt;br /&gt;
 }&lt;br /&gt;
 #endif&lt;br /&gt;
  &lt;br /&gt;
 실제 컴파일시 컴파일러는 프로그래머가 지정한 타입으로 이 함수를 인스턴스화 시켜서 생성하고 바인딩한다.&lt;br /&gt;
 typename 은 아직 인스턴스화 되지 않은 함수를 컴파일러가 읽어들일때 타입 매개변수와 관계된 타입의 형을 생성할때 앞에 붙여야 하는 키워드 임. ex) vector&amp;lt;T&amp;gt; or vector&amp;lt;T&amp;gt;::size_type&lt;br /&gt;
&lt;br /&gt;
 === 8.1.2 템플릿 인스턴스화 ===&lt;br /&gt;
 STL은 실제로 함수의 인스턴스화에 관한 표준적인 방식을 제정하지 않았다. 따라서 각 컴파일러마다 서로 다른 방식으로 함수를 인스턴스화한다. 따라서 자신의 컴파일러의 특징을 파악하는 노력이 필요.&lt;br /&gt;
* 컴파일 링크 모델 Compiler : 실제로 인스턴스가 만들어지기 전까지는 템플릿 코드의 유효성을 알 수 없다. 에러는 링크시에 발생&lt;br /&gt;
* 독자적 방식의 template 모델 Compiler : 최근의 방식. 인스턴스화를 위해서 STL 정의부에 대한 접근이 필요.&lt;br /&gt;
&lt;br /&gt;
 === 8.1.3 제네릭 함수와 타입 ===&lt;br /&gt;
 실제 제네릭 함수의 사용에서 가장 문제시 되는 것은 함수내부의 연산을 매개변수 타입이 지원을 하는 가이다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| find(B, E, D)&lt;br /&gt;
| D의 인자료 [B, E)를 비교하여 값을 찾는다. 비교를 하는 것은 크게 문제되지 않는다.&lt;br /&gt;
|-&lt;br /&gt;
| accumulate(B, E, D)&lt;br /&gt;
| D의 인자의 형을 기준으로 [B, E)를 비교하여 값을 모은다. 리턴값이 D의 자료형에 영향을 받기 때문에 문제의 발생소지가 존재한다.&lt;br /&gt;
|}&lt;br /&gt;
 ~cpp ex) accumulate(v.begin(), v.end(), 0.0); // 만약 0:int를 사용했다면 올바른 동작을 보장할 수 없다.&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;max 함수의 구현&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 template &amp;amp;lt;class T&amp;amp;gt;&lt;br /&gt;
 T max(const T&amp;amp;amp; left, const T&amp;amp;amp; right)&lt;br /&gt;
 {	&lt;br /&gt;
 	return left &amp;amp;gt; right ? left : right;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 인자로 받은 두 값의 타입이 완전히 같아야지만 올바른 동작을 보장받는다. 인자는 operator&amp;gt;(T, T)를 지원해야한다.&lt;br /&gt;
  &lt;br /&gt;
== 8.2 Data-structure independence ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| find(c.begin(), c.end(), val)&lt;br /&gt;
| 일반적인 함수의 작성 가능. 반복자를 통해서 반복자가 제공하는 방식으로 동작가능&lt;br /&gt;
|-&lt;br /&gt;
| c.find(val)&lt;br /&gt;
| 특정형의 인스턴스인 c를 통해서만 접근가능. 내장배열에 적용 불가능&lt;br /&gt;
|-&lt;br /&gt;
| find(c, val)&lt;br /&gt;
| 범위 지정이 불가능하고, 유용성이 첫번째의 경우보다 적다.&lt;br /&gt;
|}&lt;br /&gt;
* 1의 방식으로 작성된 함수으이 rbegin() 같은 템플릿 멤버 함수를 이용해서 역순 검색도 가능하게 작성된다.&lt;br /&gt;
&lt;br /&gt;
 === 8.2.1 알고리즘과 반복자 ===&lt;br /&gt;
 STL 함수를 보면 인자로 받는 반복자(iterator)에 따라서 컨테이너의 함수 사용 유효성을 알 수 있다.&lt;br /&gt;
 예를 들자면 find(B, E, D)같은 함수의 경우 &amp;#039;&amp;#039;아주 단순한 제한적 연산만을 이용&amp;#039;&amp;#039;하기 때문에 대부분의 컨테이너에 대해서 사용이 가능하다. 그러나 sort(B, E)같은 경우에는 &amp;#039;&amp;#039;기본적인 사칙연산들을 반복자에 대해서 사용&amp;#039;&amp;#039;하기 때문에 이런 연산을 지원하는 string, vector 만이 완벽하게 지원된다.&lt;br /&gt;
&lt;br /&gt;
 STL은 이런 분류를 위해서 5개의 &amp;#039;&amp;#039;&amp;#039;반복자 카테고리(iterator category)&amp;#039;&amp;#039;&amp;#039;를 정의하여 반복자를 분류한다. 카테고리의 분류는 반복자의 요소를 접근하는 방법에따른 분류이며, 이는 알고리즘의 사용 유효성 여부를 결정하는데 도움이 된다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 === 8.2.2 순차적 읽기-전용 접근 ===&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;※ 모든 순차반복자에서는 -- 연산을 할 수 없다.&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;find 구현 1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 	while(begin != end &amp;amp;amp;&amp;amp;amp; *begin != x)&lt;br /&gt;
 		++begin:&lt;br /&gt;
 	return begin;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;find 구현 2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 template &amp;amp;lt;class In, class X&amp;amp;gt; In find(In begin, In end, const X&amp;amp;amp; x) {&lt;br /&gt;
 	if (begin == end || *begin == x)&lt;br /&gt;
 		return begin;&lt;br /&gt;
 	begin++;&lt;br /&gt;
 	return find(begin, end, x);&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 상기 2개의 구현 모두 begin, end iterator를 순차적으로 접근하고 있음을 알 수 있다. 상기의 함수를 통해서 순차 읽기-전용의 반복자는 &amp;#039;&amp;#039;&amp;#039;++(전,후위), ==, !=, *&amp;#039;&amp;#039;&amp;#039;를 지원해야한다는 것을 알 수 있다. 덧 붙여서 &amp;#039;&amp;#039;&amp;#039;-&amp;gt;, .&amp;#039;&amp;#039;&amp;#039;와 같은 멤버 참조 연산자도 필요로하다. (7.2절에 사용했떤 연산자이다.)&lt;br /&gt;
 상기와 같은 반복자를 &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;입력 반복자(input iterator)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;라고 함.&lt;br /&gt;
&lt;br /&gt;
 === 8.2.3 순차적 쓰기-전용 접근 ===&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;copy 구현&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 template &amp;amp;lt;class In, class Out&amp;amp;gt; Out copy(In begin, In end, Out dest) {&lt;br /&gt;
 	if (begin != end)&lt;br /&gt;
 		*dest++ = *begin++;&lt;br /&gt;
 	return dest;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 class In 형의 반복자는 함수가 진행되는 동안 반복자를 통해서 읽기 연산만을 수행한다. class Out 형의 반복자는 *dest++ = *begin++; 의 연산을 통해서 쓰기 연산을 수행한다. 따라서 class Out 반복자는 &amp;#039;&amp;#039;&amp;#039;++(전,후위). =&amp;#039;&amp;#039;&amp;#039; 연산자만을 평가할수 있으면 된다. &lt;br /&gt;
 class Out 반복자를 출력에 배타적으로 사용하려면 &amp;#039;&amp;#039;&amp;#039;++ 연산이 대입문 사이에서 1번이상은 무효&amp;#039;&amp;#039;&amp;#039;가 되도록 만들어 주어야한다.&lt;br /&gt;
 상기 요구사항을 만족시키는 경우의 반복자를 &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;출력 반복자(Output iterator)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;라고 함. &lt;br /&gt;
 모든 컨테이너는 back_inserter(class T)를 통해서 출력 반복자를 리턴시킬 수 있다. 이 반복자는 write-once의 특성을 가진다.&lt;br /&gt;
&lt;br /&gt;
 === 8.2.4 순차적 읽기-쓰기 접근 ===&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;replace 구현&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 template &amp;amp;lt;class For, class X&amp;amp;gt; void replace(For begin, For end, const X&amp;amp;amp; x, const X&amp;amp;amp; y) {&lt;br /&gt;
 	while (beg != end) {&lt;br /&gt;
 		if (*beg == x)&lt;br /&gt;
 			*beg = y;&lt;br /&gt;
 		++beg;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 [begin, end) 의 범위안에서 x를 찾아서 y로 치환한다.&lt;br /&gt;
 여기서 beg는 입력 반복자, 출력 반복자 2가지의 특성을 모두 만족시켜야 한다.&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;*, ++(전,후위), ==, =, ., -&amp;gt;&amp;#039;&amp;#039;&amp;#039;와 같은 연산이 가능하다면 &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;순방향 반복자(forward iterator)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;라고 함.&lt;br /&gt;
&lt;br /&gt;
 === 8.2.5 역방향 접근 ===&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;reverse 구현&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 template &amp;amp;lt;class Bi&amp;amp;gt; void reverse(Bi begin, Bi end) {&lt;br /&gt;
 	while (begin != end) {&lt;br /&gt;
 		--end;&lt;br /&gt;
 &lt;br /&gt;
 		if (begin != end)&lt;br /&gt;
 			swap(*begin++, *end);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 begin 과 end 의 요소를 비교하여 다르다면 swap()시킨다.&lt;br /&gt;
 순방향 연산자의 모든 연산을 지원하고 &amp;#039;&amp;#039;&amp;#039;--&amp;#039;&amp;#039;&amp;#039;연산을 지원한다면 이 반복자는 &amp;#039;&amp;#039;&amp;#039;양방향 반복자(bidirection iterator)&amp;#039;&amp;#039;&amp;#039; 라고 부른다. 표준 라이브러리 컨테이너 클래스들은 모두 양방향 반복자를 지원함.&lt;br /&gt;
&lt;br /&gt;
 === 8.2.6 임의 접근 ===&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;binary search 구현&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 template &amp;amp;lt;class Ran, class X&amp;amp;gt; bool binary_search(Ran begin, Ran end, const X&amp;amp;amp; x) {&lt;br /&gt;
 	while (begin &amp;amp;lt; end) {&lt;br /&gt;
 		Ran mid = begin + (end - begin ) /2;&lt;br /&gt;
 		if (x &amp;amp;lt; *mid)&lt;br /&gt;
 			end = mid;&lt;br /&gt;
 		else if (*mid &amp;amp;lt; x)&lt;br /&gt;
 			begin = mid + 1;&lt;br /&gt;
 		else return true;&lt;br /&gt;
 	}&lt;br /&gt;
 	return false;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 참고자료) WikiPedia:Binary_search 바이너리 서치&lt;br /&gt;
 임의 접근 반복자의 경우 &amp;#039;&amp;#039;&amp;#039;양방향 반복자의 모든 특성&amp;#039;&amp;#039;&amp;#039;과 함께 다음과 같은 연산을 만족한다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| condition p:iterator, q:iterator, n:integer&lt;br /&gt;
|-&lt;br /&gt;
| p+n, p-n, n+p, p+q, p&amp;amp;#91;n&amp;amp;#93;, p&amp;lt;q, p&amp;gt;q, p&amp;lt;=q, p&amp;gt;q&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 임의 접근 반복자르 이용하는 알고리즘은 sort. vector, string 만이 임의 접근 반복자를 지원한다. list는 빠른 데이터의 삽입, 삭제에 최적화 되었기 때문에 순차적인 접근만 가능함.&lt;br /&gt;
&lt;br /&gt;
 === 8.2.7 반복자 범위 및 끝 지난 값 ===&lt;br /&gt;
 반복자의 끝값으로 컨테이너의 마지막 요소에서 한개가 지난 값을 사용하는 이유&lt;br /&gt;
* 마지막 요소를 범위의 끝으로 사용함으로써 발생하는 특별한 처리를 없애는 것이 가능. (실수가 줄어듬)&lt;br /&gt;
* 마지막 요소를 범위의 끝으로 정할 경우 범위안에 찾는 것이 없을때 이를 알려주는 수단이 부재하다.&lt;br /&gt;
* 단순히 != 연산으로 범위의 순회를 마치는 조건으로 이용이 가능하다. &amp;lt;&amp;gt;와 같은 크기 연산자가 불필요하다.&lt;br /&gt;
* 두번째 인자로 하나가 지난 값을 갖도록함으로써 자연스럽게 out-of-range의 상황을 파악하는 것이 가능하다.&lt;br /&gt;
  c.end() == c.begin() + c.size()    // this is true&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== 8.3 Input and output iterators ==&lt;br /&gt;
입출력 반복자는 컨테이너의 반복자이외의 존재하는 반복자를 표현하기 때문에 순방향 반복자와 구별시킴.&lt;br /&gt;
istream, ostream 의 반복자를 얻음으로써 입출력 스트림을 제어하는 것이 가능하다.&lt;br /&gt;
 vector&amp;amp;lt;int&amp;amp;gt; v;&lt;br /&gt;
 copy(istream_iterator&amp;amp;lt;int&amp;amp;gt;(cin), istream_iterator&amp;amp;lt;int&amp;amp;gt;(), back_inserter(v));&lt;br /&gt;
 //istream_iterator&amp;amp;lt;int&amp;amp;gt; 는 end-of-file, 에러상태를 가리킨다.&lt;br /&gt;
C++의 모든 입출력 연산은 타입 지정연산이다. cin&amp;gt;&amp;gt;s.midterm&amp;gt;&amp;gt;s.final&amp;gt;&amp;gt;s.homework; 에서도 타입에 따라서 다른 일을 한다.&lt;br /&gt;
&lt;br /&gt;
== 8.4 Using iterators for flexibility ==&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;
 &lt;br /&gt;
 using std::find_if;&lt;br /&gt;
 using std::string;&lt;br /&gt;
 &lt;br /&gt;
 using std::isspace;&lt;br /&gt;
 &lt;br /&gt;
 inline bool space(char c)&lt;br /&gt;
 {&lt;br /&gt;
         return isspace(c);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 inline bool not_space(char c)&lt;br /&gt;
 {&lt;br /&gt;
         return !isspace(c);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 template &amp;amp;lt;class Out&amp;amp;gt;                             // changed&lt;br /&gt;
 void split(const string&amp;amp;amp; str, Out os) {          // changed&lt;br /&gt;
 &lt;br /&gt;
 	typedef string::const_iterator iter;&lt;br /&gt;
 &lt;br /&gt;
 	iter i = str.begin();&lt;br /&gt;
 	while (i != str.end()) {&lt;br /&gt;
 		// ignore leading blanks&lt;br /&gt;
 		i = find_if(i, str.end(), not_space);&lt;br /&gt;
 &lt;br /&gt;
 		// find end of next word&lt;br /&gt;
 		iter j = find_if(i, str.end(), space);&lt;br /&gt;
 &lt;br /&gt;
 		// copy the characters in `[i,&amp;#039; `j)&amp;#039;&lt;br /&gt;
 		if (i != str.end())&lt;br /&gt;
 			*os++ = string(i, j);   // changed&lt;br /&gt;
 &lt;br /&gt;
 		i = j;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
Class Out 가 순방향, 임의접근, 출력 반복자의 요구사항을 모두 반족하기 때문에 istream_iterator만 아니라면 어떤 반복자에도 쓰일 수 있다. 즉, 특정변수로의 저장 뿐만아니라 console, file 로의 ostream 으로의 출력도 지원한다. &amp;#039;&amp;#039; 흠 대단하군.. &amp;#039;&amp;#039;&lt;br /&gt;
----&lt;br /&gt;
[[AcceleratedC++]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>