U E D R , A S I H C RSS

AcceleratedC++/Chapter8

1. Chapter 8 Writing generic functions

WikiPedia:Generic_function : ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μ „κΉŒμ§€λŠ” κ·Έ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ΄ 무엇인지 μ•Œ 수 μ—†λŠ” ν•¨μˆ˜.
Ch9~Ch12 WikiPedia:Abstract_data_type (μ΄ν•˜ ADT)의 κ΅¬ν˜„μ„ κ³΅λΆ€ν•œλ‹€.
μ°Έκ³ νŽ˜μ΄μ§€) ParametricPolymorphism

1.1. 8.1 What is a generic function?

WikiPedia:Generic_function : ν•¨μˆ˜μ˜ ν˜ΈμΆœμ‹œ 인자 νƒ€μž…μ΄λ‚˜ λ¦¬ν„΄νƒ€μž…μ„ μ‚¬μš©μžκ°€ μ•Œ μˆ˜μ—†λ‹€. ex)find(B,E,D)
ν•¨μˆ˜μ˜ ν˜ΈμΆœμ‹œ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό operand둜 ν•˜μ—¬ ν–‰ν•΄μ§€λŠ” operator의 μœ νš¨μ„±μ„ μ»΄νŒŒμΌλŸ¬κ°€ 쑰사. μ‚¬μš© κ°€λŠ₯성을 νŒλ‹¨
~cpp  ex) union(A, B) { return A+B; }
  union(A:string, " is...") (O), concaternate("COL", " is...") (X)
κ·Έλ ‡λ‹€λ©΄ μ–΄λ–»κ²Œ ν•¨μˆ˜κ°€ μ–΄λ– ν•œ 자료ꡬ쑰λ₯Ό 만쑱 μ‹œν‚€λŠ”μ§€ νŒλ‹¨ν•  수 μžˆλŠ”κ°€?
반볡자λ₯Ό μƒκ°ν•΄λ³΄μž. λ§Œμ•½ νŠΉμ • μžλ£Œκ΅¬μ‘°κ°€ 반볡자λ₯Ό λ¦¬ν„΄ν•˜λŠ” λ©€λ²„ν•¨μˆ˜λ₯Ό κ°–λŠ” λ‹€λ©΄ 반볡자λ₯Ό 인자둜 λ°›λŠ” function듀에 λŒ€ν•΄μ„œ κ·Έ μžλ£Œκ΅¬μ‘°λŠ” μœ νš¨ν•˜λ‹€κ³  νŒλ‹¨ν•  수 μžˆλ‹€.

1.1.1. 8.1.1 μ•Œλ €μ§€μ§€ μ•Šμ€ νƒ€μž…μ˜ 쀑앙 κ°’

template
μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ 객체이라도 ν•˜λ”λΌλ„ 각각의 객체λ₯Ό κ°€μ§€κ³  ν–‰ν•˜λŠ” 행동양식은 κ³΅ν†΅μ˜ 행동양식을 κ°–λŠ”λ‹€.
Runtime이 μ•„λ‹ˆλΌ Compile νƒ€μž„μ— μ‹€μ œλ‘œ νƒ€μž…μ΄ λ³€ν™”ν•˜λŠ” 객체λ₯Ό 적절히 μž‘μ„±ν•˜λ©΄ μ˜¬λ°”λ₯Έ λ™μž‘μ„ 보μž₯ν•œλ‹€.

~cpp 
//median.h
#ifndef GUARD_median_h
#define GUARD_median_h

#include <algorithm>
#include <stdexcept>
#include <vector>

using std::domain_error;
using std::sort;
using std::vector;
template <class T> 	// type λ§€κ°œλ³€μˆ˜μ˜ μ§€μ •, 이 ν•¨μˆ˜μ˜ scopeμ•ˆμ—μ„œλŠ” 데이터 ν˜•μ„ λŒ€μ‹ ν•œλ‹€.
T median(vector<T> v)
{
	typedef typename vector<T>::size_type vec_sz; 	// typename에 λŒ€ν•΄μ„œ μ•Œμž

	vec_sz size = v.size();
	if (size == 0)
		throw domain_error("median of an empty vector");

	sort(v.begin(), v.end());

	vec_sz mid = size/2;

	return size % 2 == 0 ? (v[mid] + v[mid-1]) / 2 : v[mid];	// double, intμ—λŠ” 유효, string은 operator / κ°€ μ—†κΈ° λ•Œλ¬Έμ— 무효
}
#endif
 
μ‹€μ œ μ»΄νŒŒμΌμ‹œ μ»΄νŒŒμΌλŸ¬λŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ§€μ •ν•œ νƒ€μž…μœΌλ‘œ 이 ν•¨μˆ˜λ₯Ό μΈμŠ€ν„΄μŠ€ν™” μ‹œμΌœμ„œ μƒμ„±ν•˜κ³  λ°”μΈλ”©ν•œλ‹€.
typename 은 아직 μΈμŠ€ν„΄μŠ€ν™” λ˜μ§€ μ•Šμ€ ν•¨μˆ˜λ₯Ό μ»΄νŒŒμΌλŸ¬κ°€ μ½μ–΄λ“€μΌλ•Œ νƒ€μž… λ§€κ°œλ³€μˆ˜μ™€ κ΄€κ³„λœ νƒ€μž…μ˜ ν˜•μ„ μƒμ„±ν• λ•Œ μ•žμ— λΆ™μ—¬μ•Ό ν•˜λŠ” ν‚€μ›Œλ“œ μž„. ex) vector<T> or vector<T>::size_type

1.1.2. 8.1.2 ν…œν”Œλ¦Ώ μΈμŠ€ν„΄μŠ€ν™”

STL은 μ‹€μ œλ‘œ ν•¨μˆ˜μ˜ μΈμŠ€ν„΄μŠ€ν™”μ— κ΄€ν•œ ν‘œμ€μ μΈ 방식을 μ œμ •ν•˜μ§€ μ•Šμ•˜λ‹€. λ”°λΌμ„œ 각 μ»΄νŒŒμΌλŸ¬λ§ˆλ‹€ μ„œλ‘œ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•œλ‹€. λ”°λΌμ„œ μžμ‹ μ˜ 컴파일러의 νŠΉμ§•μ„ νŒŒμ•…ν•˜λŠ” λ…Έλ ₯이 ν•„μš”.
  • 컴파일 링크 λͺ¨λΈ Compiler : μ‹€μ œλ‘œ μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§€κΈ° μ „κΉŒμ§€λŠ” ν…œν”Œλ¦Ώ μ½”λ“œμ˜ μœ νš¨μ„±μ„ μ•Œ 수 μ—†λ‹€. μ—λŸ¬λŠ” λ§ν¬μ‹œμ— λ°œμƒ
  • λ…μžμ  λ°©μ‹μ˜ template λͺ¨λΈ Compiler : 졜근의 방식. μΈμŠ€ν„΄μŠ€ν™”λ₯Ό μœ„ν•΄μ„œ STL μ •μ˜λΆ€μ— λŒ€ν•œ 접근이 ν•„μš”.

1.1.3. 8.1.3 μ œλ„€λ¦­ ν•¨μˆ˜μ™€ νƒ€μž…

μ‹€μ œ μ œλ„€λ¦­ ν•¨μˆ˜μ˜ μ‚¬μš©μ—μ„œ κ°€μž₯ λ¬Έμ œμ‹œ λ˜λŠ” 것은 ν•¨μˆ˜λ‚΄λΆ€μ˜ 연산을 λ§€κ°œλ³€μˆ˜ νƒ€μž…μ΄ 지원을 ν•˜λŠ” 가이닀.
find(B, E, D) D의 인자료 [B, E)λ₯Ό λΉ„κ΅ν•˜μ—¬ 값을 μ°ΎλŠ”λ‹€. 비ꡐλ₯Ό ν•˜λŠ” 것은 크게 λ¬Έμ œλ˜μ§€ μ•ŠλŠ”λ‹€.
accumulate(B, E, D) D의 인자의 ν˜•μ„ κΈ°μ€μœΌλ‘œ [B, E)λ₯Ό λΉ„κ΅ν•˜μ—¬ 값을 λͺ¨μ€λ‹€. 리턴값이 D의 μžλ£Œν˜•μ— 영ν–₯을 λ°›κΈ° λ•Œλ¬Έμ— 문제의 λ°œμƒμ†Œμ§€κ°€ μ΄μž¬ν•œλ‹€.
~cpp ex) accumulate(v.begin(), v.end(), 0.0); // λ§Œμ•½ 0:intλ₯Ό μ‚¬μš©ν–ˆλ‹€λ©΄ μ˜¬λ°”λ₯Έ λ™μž‘μ„ 보μž₯ν•  수 μ—†λ‹€.
max ν•¨μˆ˜μ˜ κ΅¬ν˜„
~cpp 
template <class T>
T max(const T& left, const T& right)
{	
	return left > right ? left : right;
}
 
인자둜 받은 두 κ°’μ˜ νƒ€μž…μ΄ μ™„μ „νžˆ κ°™μ•„μ•Όμ§€λ§Œ μ˜¬λ°”λ₯Έ λ™μž‘μ„ 보μž₯λ°›λŠ”λ‹€. μΈμžλŠ” operator>(T, T)λ₯Ό μ§€μ›ν•΄μ•Όν•œλ‹€.

1.2. 8.2 Data-structure independence

find(c.begin(), c.end(), val) 일반적인 ν•¨μˆ˜μ˜ μž‘μ„± κ°€λŠ₯. 반볡자λ₯Ό ν†΅ν•΄μ„œ λ°˜λ³΅μžκ°€ μ œκ³΅ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘κ°€λŠ₯
c.find(val) νŠΉμ •ν˜•μ˜ μΈμŠ€ν„΄μŠ€μΈ cλ₯Ό ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όκ°€λŠ₯. λ‚΄μž₯배열에 적용 λΆˆκ°€λŠ₯
find(c, val) λ²”μœ„ 지정이 λΆˆκ°€λŠ₯ν•˜κ³ , μœ μš©μ„±μ΄ 첫번째의 κ²½μš°λ³΄λ‹€ 적닀.
  • 1의 λ°©μ‹μœΌλ‘œ μž‘μ„±λœ ν•¨μˆ˜μœΌμ΄ rbegin() 같은 ν…œν”Œλ¦Ώ 멀버 ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μ—­μˆœ 검색도 κ°€λŠ₯ν•˜κ²Œ μž‘μ„±λœλ‹€.

1.2.1. 8.2.1 μ•Œκ³ λ¦¬μ¦˜κ³Ό 반볡자

STL ν•¨μˆ˜λ₯Ό 보면 인자둜 λ°›λŠ” 반볡자(iterator)에 λ”°λΌμ„œ μ»¨ν…Œμ΄λ„ˆμ˜ ν•¨μˆ˜ μ‚¬μš© μœ νš¨μ„±μ„ μ•Œ 수 μžˆλ‹€.
예λ₯Ό λ“€μžλ©΄ find(B, E, D)같은 ν•¨μˆ˜μ˜ 경우 μ•„μ£Ό λ‹¨μˆœν•œ μ œν•œμ  μ—°μ‚°λ§Œμ„ μ΄μš©ν•˜κΈ° λ•Œλ¬Έμ— λŒ€λΆ€λΆ„μ˜ μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•΄μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. κ·ΈλŸ¬λ‚˜ sort(B, E)같은 κ²½μš°μ—λŠ” 기본적인 사칙연산듀을 λ°˜λ³΅μžμ— λŒ€ν•΄μ„œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 이런 연산을 μ§€μ›ν•˜λŠ” string, vector 만이 μ™„λ²½ν•˜κ²Œ μ§€μ›λœλ‹€.
STL은 이런 λΆ„λ₯˜λ₯Ό μœ„ν•΄μ„œ 5개의 반볡자 μΉ΄ν…Œκ³ λ¦¬(iterator category)λ₯Ό μ •μ˜ν•˜μ—¬ 반볡자λ₯Ό λΆ„λ₯˜ν•œλ‹€. μΉ΄ν…Œκ³ λ¦¬μ˜ λΆ„λ₯˜λŠ” 반볡자의 μš”μ†Œλ₯Ό μ ‘κ·Όν•˜λŠ” 방법에따λ₯Έ λΆ„λ₯˜μ΄λ©°, μ΄λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ μ‚¬μš© μœ νš¨μ„± μ—¬λΆ€λ₯Ό κ²°μ •ν•˜λŠ”λ° 도움이 λœλ‹€.

1.2.2. 8.2.2 순차적 읽기-μ „μš© μ ‘κ·Ό

β€» λͺ¨λ“  μˆœμ°¨λ°˜λ³΅μžμ—μ„œλŠ” -- 연산을 ν•  수 μ—†λ‹€.
find κ΅¬ν˜„ 1
~cpp template <class In, class X> In find(In begin, In end, const X& x) {
	while(begin != end && *begin != x)
		++begin:
	return begin;
}
 
find κ΅¬ν˜„ 2
~cpp 
template <class In, class X> In find(In begin, In end, const X& x) {
	if (begin == end || *begin == x)
		return begin;
	begin++;
	return find(begin, end, x);
}
 
상기 2개의 κ΅¬ν˜„ λͺ¨λ‘ begin, end iteratorλ₯Ό 순차적으둜 μ ‘κ·Όν•˜κ³  μžˆμŒμ„ μ•Œ 수 μžˆλ‹€. μƒκΈ°μ˜ ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ 순차 읽기-μ „μš©μ˜ λ°˜λ³΅μžλŠ” ++(μ „,ν›„μœ„), ==, !=, *λ₯Ό μ§€μ›ν•΄μ•Όν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. 덧 λΆ™μ—¬μ„œ ->, .와 같은 멀버 μ°Έμ‘° μ—°μ‚°μžλ„ ν•„μš”λ‘œν•˜λ‹€. (7.2μ ˆμ— μ‚¬μš©ν–ˆλ–€ μ—°μ‚°μžμ΄λ‹€.)
상기와 같은 반볡자λ₯Ό μž…λ ₯ 반볡자(input iterator)라고 함.

1.2.3. 8.2.3 순차적 μ“°κΈ°-μ „μš© μ ‘κ·Ό

copy κ΅¬ν˜„
~cpp 
template <class In, class Out> Out copy(In begin, In end, Out dest) {
	if (begin != end)
		*dest++ = *begin++;
	return dest;
}
 
class In ν˜•μ˜ λ°˜λ³΅μžλŠ” ν•¨μˆ˜κ°€ μ§„ν–‰λ˜λŠ” λ™μ•ˆ 반볡자λ₯Ό ν†΅ν•΄μ„œ 읽기 μ—°μ‚°λ§Œμ„ μˆ˜ν–‰ν•œλ‹€. class Out ν˜•μ˜ λ°˜λ³΅μžλŠ” *dest++ = *begin++; 의 연산을 ν†΅ν•΄μ„œ μ“°κΈ° 연산을 μˆ˜ν–‰ν•œλ‹€. λ”°λΌμ„œ class Out λ°˜λ³΅μžλŠ” ++(μ „,ν›„μœ„). = μ—°μ‚°μžλ§Œμ„ ν‰κ°€ν• μˆ˜ 있으면 λœλ‹€.
class Out 반볡자λ₯Ό 좜λ ₯에 λ°°νƒ€μ μœΌλ‘œ μ‚¬μš©ν•˜λ €λ©΄ ++ 연산이 λŒ€μž…λ¬Έ μ‚¬μ΄μ—μ„œ 1λ²ˆμ΄μƒμ€ λ¬΄νš¨κ°€ λ˜λ„λ‘ λ§Œλ“€μ–΄ μ£Όμ–΄μ•Όν•œλ‹€.
상기 μš”κ΅¬μ‚¬ν•­μ„ λ§Œμ‘±μ‹œν‚€λŠ” 경우의 반볡자λ₯Ό 좜λ ₯ 반볡자(Output iterator)라고 함.
λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλŠ” back_inserter(class T)λ₯Ό ν†΅ν•΄μ„œ 좜λ ₯ 반볡자λ₯Ό λ¦¬ν„΄μ‹œν‚¬ 수 μžˆλ‹€. 이 λ°˜λ³΅μžλŠ” write-once의 νŠΉμ„±μ„ κ°€μ§„λ‹€.

1.2.4. 8.2.4 순차적 읽기-μ“°κΈ° μ ‘κ·Ό

replace κ΅¬ν˜„
~cpp 
template <class For, class X> void replace(For begin, For end, const X& x, const X& y) {
	while (beg != end) {
		if (*beg == x)
			*beg = y;
		++beg;
	}
}
 
[begin, end) 의 λ²”μœ„μ•ˆμ—μ„œ xλ₯Ό μ°Ύμ•„μ„œ y둜 μΉ˜ν™˜ν•œλ‹€.
μ—¬κΈ°μ„œ begλŠ” μž…λ ₯ 반볡자, 좜λ ₯ 반볡자 2κ°€μ§€μ˜ νŠΉμ„±μ„ λͺ¨λ‘ λ§Œμ‘±μ‹œμΌœμ•Ό ν•œλ‹€.
*, ++(μ „,ν›„μœ„), ==, =, ., ->와 같은 연산이 κ°€λŠ₯ν•˜λ‹€λ©΄ 순방ν–₯ 반볡자(forward iterator)라고 함.

1.2.5. 8.2.5 μ—­λ°©ν–₯ μ ‘κ·Ό

reverse κ΅¬ν˜„
~cpp 
template <class Bi> void reverse(Bi begin, Bi end) {
	while (begin != end) {
		--end;

		if (begin != end)
			swap(*begin++, *end);
	}
}
 
begin κ³Ό end 의 μš”μ†Œλ₯Ό λΉ„κ΅ν•˜μ—¬ λ‹€λ΄λ‹€λ©΄ swap()μ‹œν‚¨λ‹€.
순방ν–₯ μ—°μ‚°μžμ˜ λͺ¨λ“  연산을 μ§€μ›ν•˜κ³  --연산을 μ§€μ›ν•œλ‹€λ©΄ 이 λ°˜λ³΅μžλŠ” μ–‘λ°©ν–₯ 반볡자(bidirection iterator) 라고 λΆ€λ₯Έλ‹€. ν‘œμ€ λΌμ΄λΈŒλŸ¬λ¦¬ μ»¨ν…Œμ΄λ„ˆ ν΄λž˜μŠ€λ“€μ€ λͺ¨λ‘ μ–‘λ°©ν–₯ 반볡자λ₯Ό 지원함.

1.2.6. 8.2.6 μž„μ˜ μ ‘κ·Ό

binary search κ΅¬ν˜„
~cpp 
template <class Ran, class X> bool binary_search(Ran begin, Ran end, const X& x) {
	while (begin < end) {
		Ran mid = begin + (end - begin ) /2;
		if (x < *mid)
			end = mid;
		else if (*mid < x)
			begin = mid + 1;
		else return true;
	}
	return false;
}
 
참고자료) WikiPedia:Binary_searchλ°”μ΄λ„ˆλ¦¬ μ„œμΉ˜
μž„μ˜ μ ‘κ·Ό 반볡자의 경우 μ–‘λ°©ν–₯ 반볡자의 λͺ¨λ“  νŠΉμ„±κ³Ό ν•¨κ»˜ λ‹€μŒκ³Ό 같은 연산을 λ§Œμ‘±ν•œλ‹€.
condition p:iterator, q:iterator, n:integer
p+n, p-n, n+p, p+q, pn, p<q, p>q, p<=q, p>q

μž„μ˜ μ ‘κ·Ό λ°˜λ³΅μžλ΄ μ΄μš©ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ€ sort. vector, string 만이 μž„μ˜ μ ‘κ·Ό 반볡자λ₯Ό μ§€μ›ν•œλ‹€. listλŠ” λΉ λ₯Έ λ°μ΄ν„°μ˜ μ‚½μž…, μ‚­μ œμ— μ΅œμ ν™” λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 순차적인 μ ‘κ·Όλ§Œ κ°€λŠ₯함.

1.2.7. 8.2.7 반볡자 λ²”μœ„ 및 끝 μ§€λ‚œ κ°’

반볡자의 λκ°’μœΌλ‘œ μ»¨ν…Œμ΄λ„ˆμ˜ λ§ˆμ§€λ§‰ μš”μ†Œμ—μ„œ ν•œκ°œκ°€ μ§€λ‚œ 값을 μ‚¬μš©ν•˜λŠ” 이유
  • λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό λ²”μœ„μ˜ 끝으둜 μ‚¬μš©ν•¨μœΌλ‘œμ¨ λ°œμƒν•˜λŠ” νŠΉλ³„ν•œ 처리λ₯Ό μ—†μ• λŠ” 것이 κ°€λŠ₯. (μ‹€μˆ˜κ°€ 쀄어듬)
  • λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό λ²”μœ„μ˜ 끝으둜 μ •ν•  경우 λ²”μœ„μ•ˆμ— μ°ΎλŠ” 것이 μ—†μ„λ•Œ 이λ₯Ό μ•Œλ €μ£ΌλŠ” μˆ˜λ‹¨μ΄ λΆ€μž¬ν•˜λ‹€.
  • λ‹¨μˆœνžˆ != μ—°μ‚°μœΌλ‘œ λ²”μœ„μ˜ 순회λ₯Ό λ§ˆμΉ˜λŠ” 쑰건으둜 이용이 κ°€λŠ₯ν•˜λ‹€. <>와 같은 크기 μ—°μ‚°μžκ°€ λΆˆν•„μš”ν•˜λ‹€.
  • λ‘λ²ˆμ§Έ 인자둜 ν•˜λ‚˜κ°€ μ§€λ‚œ 값을 κ°–λ„λ‘ν•¨μœΌλ‘œμ¨ μžμ—°μŠ€λŸ½κ²Œ out-of-range의 상황을 νŒŒμ•…ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.
    ~cpp 
     c.end() == c.begin() + c.size()    // this is true
     
  • 1.3. 8.3 Input and output iterators

    μž…μΆœλ ₯ λ°˜λ³΅μžλŠ” μ»¨ν…Œμ΄λ„ˆμ˜ λ°˜λ³΅μžμ΄μ™Έμ˜ μ΄μž¬ν•˜λŠ” 반볡자λ₯Ό ν‘œν˜„ν•˜κΈ° λ•Œλ¬Έμ— 순방ν–₯ λ°˜λ³΅μžμ™€ κ΅¬λ³„μ‹œν‚΄.
    istream, ostream 의 반볡자λ₯Ό μ–»μŒμœΌλ‘œμ¨ μž…μΆœλ ₯ μŠ€νŠΈλ¦Όμ„ μ œμ–΄ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.
    ~cpp 
    vector<int> v;
    copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(v));
    //istream_iterator<int> λŠ” end-of-file, μ—λŸ¬μƒνƒœλ₯Ό 가리킨닀.
    
    C++의 λͺ¨λ“  μž…μΆœλ ₯ 연산은 νƒ€μž… 지정연산이닀. cin>>s.midterm>>s.final>>s.homework; μ—μ„œλ„ νƒ€μž…μ— λ”°λΌμ„œ λ‹€λ₯Έ 일을 ν•œλ‹€.

    1.4. 8.4 Using iterators for flexibility

    ~cpp 
    #include <algorithm>
    #include <cctype>
    #include <string>
    
    using std::find_if;
    using std::string;
    
    using std::isspace;
    
    inline bool space(char c)
    {
            return isspace(c);
    }
    
    inline bool not_space(char c)
    {
            return !isspace(c);
    }
    
    template <class Out>                             // changed
    void split(const string& str, Out os) {          // changed
    
    	typedef string::const_iterator iter;
    
    	iter i = str.begin();
    	while (i != str.end()) {
    		// ignore leading blanks
    		i = find_if(i, str.end(), not_space);
    
    		// find end of next word
    		iter j = find_if(i, str.end(), space);
    
    		// copy the characters in `[i,' `j)'
    		if (i != str.end())
    			*os++ = string(i, j);   // changed
    
    		i = j;
    	}
    }
    
    Class Out κ°€ 순방ν–₯, μž„μ˜μ ‘κ·Ό, 좜λ ₯ 반볡자의 μš”κ΅¬μ‚¬ν•­μ„ λͺ¨λ‘ λ°˜μ‘±ν•˜κΈ° λ•Œλ¬Έμ— istream_iterator만 μ•„λ‹ˆλΌλ©΄ μ–΄λ–€ λ°˜λ³΅μžμ—λ„ 쓰일 수 μžˆλ‹€. 즉, νŠΉμ •λ³€μˆ˜λ‘œμ˜ μ €μž₯ λΏλ§Œμ•„λ‹ˆλΌ console, file 둜의 ostream 으둜의 좜λ ₯도 μ§€μ›ν•œλ‹€. 흠 λŒ€λ‹¨ν•˜κ΅°..
    ----
    AcceleratedC++
    Valid XHTML 1.0! Valid CSS! powered by MoniWiki
    last modified 2021-02-07 05:22:25
    Processing time 0.0354 sec