SlideShare a Scribd company logo
1 of 73
--------------------------------------------------------------------------------
STL (Standard Templete Library) -form www.devpia.com VC+
+ lecture
๋ฒˆ์—ญ : Yonghan, Yoon (yonghany@orgio.net)
ํŽธ์ง‘ : Insik, You (kaerun@hanmail.net) ๏ƒŸ ์ฃผ์„(K: )
--------------------------------------------------------------------------------
THE WAITE GROUP"s
Object-Oriented Programming in C+
+ Third Edition
Robert Lafore(Author) SAMS(Publisher)
๋ž€ ์ฑ…์—์„œ STL๋ถ€๋ถ„๋งŒ ๋ฒˆ์—ญํ•œ ๊ฒ๋‹ˆ๋‹ค.
--------------------------------------------------------------------------------
0. ๊ฐœ์š”
STL์—์„œ ์ค‘์š”ํ•œ ์„ธ๊ฐ€์ง€ ์—”ํ‹ฐํ‹ฐ๋Š” containers, algorithms, iteraters์ด๋‹ค.
containers:
๋ฉ”๋ชจ๋ฆฌ์— ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค. template class๋กœ
๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ์‰ฝ๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•  ์ˆ˜์žˆ๋‹ค.
algorithms:
-containers๊ฐ€ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ์‹œ์ ธ๋‹ค.
(์˜ˆ, sort, copy, search,merge)
- template class๋กœ ๊ตฌํ˜„๋จ(ํ•˜์ง€๋งŒ container์˜๋ฉค๋ฒ„๋Š” ์•„๋‹˜)
iterators:
- ํฌ์ธํ„ฐ ๊ฐœ๋…์„ ์ผ๋ฐ˜ํ™” ์‹œํ‚จ๊ฒƒ.
- ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
- ํฌ์ธํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋“ฏ์ด iterator๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ iterator๋Š”
์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.
- iterator๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— STL์—์„œ ํ•ต์‹ฌ ๋ถ€๋ถ„์ด๋‹ค.
1.์ฝ˜ํ…Œ์ด๋„ˆ
์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ๋‚˜ int, float๊ฐ™์€ built-in ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„
๋งํ•œ๋‹ค. STL์€ 7๊ฐ€์ง€ basic type์ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, basic type์—์„œ ์ƒ์†๋œ
3๊ฐ€์ง€ ํƒ€์ž…์ด ๋” ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  basic type์—์„œ ์ƒ์† ๋ฐ›๋Š” ์ž์‹ ๋งŒ์˜ ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์ˆ˜๋„ ์žˆ๋‹ค.
๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ๋•Œ ์™œ C+
+ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฑฐ์ฅ? ์ด์ฏค์—์„œ ์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€
์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ถ๊ธˆํ•  ๊ฒƒ์ด๋‹ค.
๋ฐฐ์—ด์€ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“ค๊ณ  ์–ด๋–ค ์ƒํ™ฉ์—์„  ๋Š๋ฆฌ๋‹ค.
STL์—์„œ ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” sequence, associative์˜ 2๊ฐ€์ง€ ๋ฉ”์ธ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ์š”์•ฝ๋œ๋‹ค.
sequence ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” vector,list,deque๋กœ ๋ถ„๋ฅ˜๋˜๊ณ 
associative ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” set, multiset,map, multimap์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.
์—ฌ๊ธฐ์— ์ถ”๊ฐ€๋กœ sequence ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์†๋ฐ›์€ ๋ช‡๊ฐœ์˜ ํŠน์ˆ˜ํ•œ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์ด ์žˆ๋‹ค.
(stack, queue,priority_queue)
๊ทธ๋Ÿผ ๋‹ค์Œ์— ์ฐจ๋ก€๋กœ ์ด ์นดํ…Œ๊ณ ๋ฆฌ๋“ค์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๊ธฐ๋กœ ํ•˜์ž.
1.1 sequence containers
sequence ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ๊ฑฐ๋ฆฌ์— ๋Š˜์–ด์„  ์ง‘๋“ค์ฒ˜๋Ÿผ line์œผ๋กœ ์‹œ๊ฐํ™” ํ• ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋“ค์˜
์ง‘ํ•ฉ์„ ์ €์žฅํ•œ๋‹ค. ๊ฐ ์š”์†Œ๋“ค์€ ์„ ์„ ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.
๋์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๊ฐ ์š”์†Œ๋“ค์€ ์–ด๋–ค ์š”์†Œ๋“ค์˜ ์•ž์— ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ๋’ค์— ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ C+
+ ๋ฐฐ์—ด์ด sequence ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์˜ˆ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
C+
+ ๋ฐฐ์—ด์˜ ํ•œ๊ฐ€์ง€ ๋ฌธ์ œ์ ์€ compile-time์— ๋ฐ˜๋“œ์‹œ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋ ์ง€๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์ผ์ด๋‹ค.
๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ์˜ ์ตœ๋Œ€๊ฐฏ์ˆ˜๋ฅผ ์ถ”์ธกํ•˜์—ฌ ์ถฉ๋ถ„ํžˆ ํฌ๊ฒŒ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ
ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐฐ์—ด ๊ณต๊ฐ„์ด ๋‚ญ๋น„๋˜๊ณ  ๋˜๋Š” ์‹คํ–‰ ๊ณต๊ฐ„ ๋ถ€์กฑ
์—๋Ÿฌ๋ฅผ ๋„์ถœํ•ด ๋‚ธ๋‹ค(์‹ฌ์ง€์–ด๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถฐ๋ฒ„๋ฆฌ๊ธฐ ๊นŒ์ง€ ํ•œ๋‹ค). vector ์ฝ˜ํ…Œ์ด๋„ˆ๋Š”
์ด๋Ÿฌํ•œ ๋ณต์žก์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ์ œ๊ณตํ•œ๋‹ค.
๋ฐฐ์—ด์˜ ๋˜๋‹ค๋ฅธ ๋ฌธ์ œ์ ์€ employee ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ employee์ด ์ด๋ฆ„์œผ๋กœ ์ •๋ ฌ
ํ•˜๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ด๋ฆ„์ด L๋กœ ์‹œ์ž‘ํ•˜๋Š” employee๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค ํ• ๋•Œ M๋ถ€ํ„ฐ Z๊นŒ์ง€ ๋ชจ๋“ 
employee ๋ ˆ์ฝ”๋“œ๋ฅผ ์ด๋™์‹œ์ผœ์•ผ๋งŒ ํ•œ๋‹ค. ์ด ์ž‘์—…์€ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ๊ฒƒ์ด๋‹ค.
STL์€ ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๊ฐœ๋…์— ๊ธฐ์ดˆํ•œ list ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
์„ธ๋ฒˆ์งธ sequence container๋Š” stack๊ณผ queue๋ฅผ ์กฐํ•ฉํ•œ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” deque ์ด๋‹ค.
stack์€ last-in-first-out ๊ฐœ๋…์ด๊ณ , queue๋Š” first-in-first-out๊ฐœ๋…์ด๋‹ค.
๋”ฐ๋ผ์„œ deque๋Š” ์–‘๋์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ์‚ญ์ œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. deque๋ผ๋Š” ๋‹จ์–ด๋Š”
Double-Ended-QUEeue๋ฅผ ์กฐํ•ฉํ•œ ๊ฒƒ์ด๋‹ค. ์œตํ†ต์„ฑ ์žˆ๋Š” ๋ฉ”์นด๋‹ˆ์ฆ˜์œผ๋กœ์จ deque์ž์ฒด๋กœ๋„
์œ ์šฉํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ stack๊ณผ queue๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ…Œ์ด๋ธ” 1.1 Basic sequence Container
================================================================================
ํŠน์ง• ์žฅ๋‹จ์ 
================================================================================
์ผ๋ฐ˜ C+
+ ๋ฐฐ์—ด ๊ณ ์ •ํฌ๊ธฐ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์•ก์„ธ์Šค
์ค‘๊ฐ„๊ฐ’์˜ ์ถ”๊ฐ€ ์‚ญ์ œ ๋Š๋ฆผ.
run-time์‹œ์— ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
--------------------------------------------------------------------------------
vector ์žฌ๋ฐฐ์น˜,ํ™•์žฅ๋ฐฐ์—ด ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์•ก์„ธ์Šค
์ค‘๊ฐ„๊ฐ’ ์ถ”๊ฐ€ ์‚ญ์ œ ๋Š๋ฆผ
๋์— ๊ฐ’ ์ถ”๊ฐ€ ์‚ญ์ œ๋Š” ๋น ๋ฆ„.
--------------------------------------------------------------------------------
list Doubly linked list ์–ด๋–ค ์œ„์น˜์—์„œ๊ฑด ์ถ”๊ฐ€ ์‚ญ์ œ ๋น ๋ฆ„.
์–‘๋์—์„œ๋ถ€ํ„ฐ ์•ก์„ธ์Šค ๋น ๋ฆ„.
์ž„์˜ ์ ‘๊ทผ ๋Š๋ฆผ
--------------------------------------------------------------------------------
deque vector์™€ ์œ ์‚ฌ , ๋น ๋ฅธ ์ž„์˜์ ‘๊ทผ(์ธ๋ฑ์Šค๋ฒˆํ˜ธ ์ด์šฉ)
๊ทธ๋Ÿฌ๋‚˜ ์–‘๋์—์„œ ์ค‘๊ฐ„๊ฐ’ ์ถ”๊ฐ€์‚ญ์ œ ๋Š๋ฆผ
์•ก์„ธ์Šค ๊ฐ€๋Šฅ ์–‘๋์—์„œ ๋น ๋ฅธ ์ถ”๊ฐ€์‚ญ์ œ(push & pop)
================================================================================
STL์„ ์ƒ์„ฑํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ํ—ค๋”๋ฅผ includeํ•ด์•ผ ํ•œ๋‹ค.
์˜ˆ)
vector< int> aVect; // ints ๋ฒกํ„ฐ ์ƒ์„ฑ (K:ints = integer)
๋˜๋Š”
list< airtime> depature_list; // airtime ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
์˜ˆ์ œ์—์„œ ์ฃผ๋ชฉํ•  ๊ฒƒ์€ STL ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฝ˜ํ…Œ์ด๋„ˆ๋Š”
์Šค์Šค๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค.
1.2 Associate Containers
associate ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” sequential์ด ์•„๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์•ก์„ธ์Šคํ•œ๋‹ค.
์–ด๋–ค ์ €์žฅ๋œ ์š”์†Œ๋“ค์„ ํŠน๋ณ„ํ•œ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ํ‚ค๋ฅผ
์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์€ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋‹จ์–ด๋ฅผ ์ฐพ์•„๋ณด๋Š” ๋ณดํ†ต ์˜์–ด ์‚ฌ์ „๊ณผ ๊ฐ™๋‹ค.
ํ‚ค๊ฐ’์„ ์ฃผ๋ฉด ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ์ด ๊ฐ’์„ ์š”์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ํ‚ค๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด
์‹ ์†ํ•˜๊ฒŒ ์—ฐ๊ด€๋œ ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. STL์—๋Š” set๊ณผ map์˜ ๋‘ ์ข…๋ฅ˜์˜ associative
์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋น ๋ฅธ ๊ฒ€์ƒ‰,์ถ”๊ฐ€,์‚ญ์ œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ
๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. set๊ณผ map์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์ ํ•ฉํ•œ
๋งค์šฐ ์œตํ†ต์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ •๋ ฌ๊ณผ ์ž„์˜์ ‘๊ทผ์— ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์˜คํผ๋ ˆ์ด์…˜์€ ๋น„ํšจ์œจ์ ์ด๋‹ค.
set์€ map๋ณด๋‹ค ์‰ฝ๊ณ  ์ฃผ๋กœ ์ด์šฉ๋œ๋‹ค. set์€ ํ‚ค๋ฅผ ํฌํ•จํ•œ ์•„์ดํ…œ ๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
ํ‚ค๋Š” ์•„์ดํ…œ์„ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, set์œผ๋กœ person์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ €์žฅํ• ๋•Œ
์ด๋ฆ„์†์„ฑ์„ ํ‚ค๊ฐ’์œผ๋กœ ์ •๋ ฌํ•ด์„œ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰์„ ํ•ด์„œ
๋น ๋ฅด๊ฒŒ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. int๊ฐ™์€ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์ €์žฅํ•œ๋‹ค๋ฉด, ํ‚ค๋Š” int ๊ฐ™์€ ๊ธฐ๋ณธ ํƒ€์ž…์„
ํ†ต์งธ๋กœ ์ €์žฅ๋œ๋‹ค. ๋•Œ๋ก  ํ‚ค๊ฐ’์œผ๋กœ set์— ์ €์žฅ๋œ ์ „์ฒด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ the ์†์„ฑ์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค ์˜ค๋ธŒ์ ํŠธ๋ผ
๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค. ํ‚ค๋Š” ์ „์ฒด ์•„์ดํ…œ์ด ์•„๋‹ˆ๋‹ค.
map์€ ํ‚ค(key)์™€ ๊ฐ’(value) ์˜ค๋ธŒ์ ํŠธ ์Œ์„ ์ €์žฅํ•œ๋‹ค. map์€ ์ข…์ข… ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜์ง€๋งŒ
๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ , ์ž„์˜ ํƒ€์ž…์„ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
๋‹ค์‹œ๋งํ•ด์„œ ํ‚ค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ธ๋ฑ์Šค ์—ญํ• ์„ ํ•˜๊ณ  value ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์ด ๋œ๋‹ค.
set๊ณผ map ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ์ €์žฅ๋œ ๊ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ์˜ค์ง ํ•˜๋‚˜์˜ ํ‚ค๋งŒ์„ ์ œ๊ณตํ•œ๋‹ค.
๋ฐ˜๋ฉด์— multimap๊ณผ multiset ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” mulitple key๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
Table 1.2 Basic Associative Containers
================================================================================
ํŠน์ง•
================================================================================
set ํ‚ค ์˜ค๋ธŒ์ ํŠธ๋งŒ ์ €์žฅํ•˜๊ณ  ๊ฐ value์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์˜ ํ‚ค๋งŒ ์ œ๊ณต.
--------------------------------------------------------------------------------
multiset ํ‚ค ์˜ค๋ธŒ์ ํŠธ๋งŒ ์ €์žฅํ•˜์ง€๋งŒ ๋ณต์ˆ˜๊ฐœ์˜ ํ‚ค๋ฅผ ์ œ๊ณต.
--------------------------------------------------------------------------------
map value์™€ ํ‚ค๋ฅผ ์—ฐ๊ด€์‹œํ‚ด. ๊ฐ value์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ํ‚ค๋งŒ ์ œ๊ณต.
--------------------------------------------------------------------------------
multimap value์™€ ํ‚ค๋ฅผ ์—ฐ๊ด€์‹œํ‚ด. ๋ณต์ˆ˜๊ฐœ์˜ ํ‚ค๋ฅผ ์ œ๊ณต.
================================================================================
associative ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ƒ์„ฑ์€ sequential ์ฝ˜ํ…Œ์ด๋„ˆ์ฒ˜๋Ÿผ ํ•˜๋ฉด๋œ๋‹ค.
set< int> intSet; // ints์˜ set์„ ์ƒ์„ฑ
๋˜๋Š”
multiset< employee> machinists; // employee์˜ multiset์„ ์ƒ์„ฑ
1.3 Member Functions
์•Œ๊ณ ๋ฆฌ์ฆ˜์€ sorting์ด๋‚˜ searhing ๊ฐ™์€ ๋ณต์žกํ•œ ์˜คํผ๋ ˆ์ด์…˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๊ธฐ ์œ„ํ•ด
STL์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ ์ฝ˜ํ…Œ์ด๋„ˆ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํŠน๋ณ„ํ•œ ํƒ€์ž…์˜ ์ž‘์—…์„
์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
ํ…Œ์ด๋ธ” 1.3์€ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ˜ํ…Œ์ด๋„ˆ์— ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.
Table 1.3 Some Member Functions Common All Containers
================================================================================
์ด๋ฆ„ ๋ชฉ์ 
================================================================================
size() ์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ์•„์ดํ…œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฆฌํ„ด
--------------------------------------------------------------------------------
empty() ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ empty๋ฉด true๋ฅผ ๋ฆฌํ„ด
--------------------------------------------------------------------------------
max_size() ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ํฌ๊ธฐ ๋ฆฌํ„ด
--------------------------------------------------------------------------------
begin() ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘์ ์„ iterator๋กœ ๋ฆฌํ„ด, forward iteration
--------------------------------------------------------------------------------
end() ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋์ ์„ iterator๋กœ ๋ฆฌํ„ด, end forward iteration
--------------------------------------------------------------------------------
rbegin( ) backword iteration์„ ์œ„ํ•ด ์—ญ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” iterator๋ฅผ ๋ฆฌํ„ด
--------------------------------------------------------------------------------
rend() rbegin()์˜ ๋ฐ˜๋Œ€ ๋์„ iterator๋กœ ๋ฆฌํ„ด
================================================================================
์ด ๋ฐ–์—๋„ ๊ฐ๊ฐ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์ด ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋’ค๋กœ ๋ฏธ๋ฃจ๋„๋ก ํ•œ๋‹ค.
1.4 Container Adapters
container adapter๋ผ ๋ถˆ๋ฆฌ๋Š” ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ์ผ๋ฐ˜์ ์ธ ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ ๋ถ€ํ„ฐ ํŠน๋ณ„ํ•œ ๋ชฉ์ ์„ ๊ฐ–๋Š”
์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ํŠน๋ณ„ํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์€
์ผ๋ฐ˜์ ์ธ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค ๋ณด๋‹ค๋„ ๋” ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
STL์—์„œ ์ฝ˜ํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ๋กœ ๊ตฌํ˜„๋œ ํŠน๋ณ„ํ™”๋œ ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ๋Š” stacks, queues, ๊ทธ๋ฆฌ๊ณ 
priority queues๋“ฑ์ด ์žˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์นœ์ˆ™ํ•œ ์Šคํƒ์€ ์Šคํƒ์˜ top์—์„œ ํ˜น์€ bottom์—์„œ
pushing๊ณผ popping์ด ์ œํ•œ๋œ ์•ก์„ธ์Šค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ์—์„  ํ•œ์ชฝ ๋์—์„œ ์•„์ดํ…œ์„ pushํ•˜๊ณ 
๋‹ค๋ฅธ ํ•œ์ชฝ์—์„œ ๊ทธ ์•„์ดํ…œ์„ popํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ์„ ์ˆœ์œ„ ํ(priority queue)
์—์„œ๋Š” ์ž„์˜ ์ˆœ์„œ๋กœ ์ „๋ฐฉ์—์„œ ์•„์ดํ…œ์„ push ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ•œ์ชฝ์—์„œ ๊ทธ ์•„์ดํ…œ์„
popํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๊ฐ€์žฅ ํฐ ์•„์ดํ…œ ๋ถ€ํ„ฐ popํ•˜๊ฒŒ ๋œ๋‹ค(์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์ž๋™์œผ๋กœ ์ •๋ ฌ์„ ํ•œ๋‹ค).
deque๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ธด ํ•˜์ง€๋งŒ ์Šคํƒ, ํ, ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ sequence ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ๋ถ€ํ„ฐ
์ƒ์„ฑ๋œ๋‹ค. ํ…Œ์ด๋ธ” 1.4๋Š” ์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€์ž…(abstract data type)๊ณผ ๊ตฌํ˜„์— ์‚ฌ์šฉ๋œ
์‹œํ€€์Šค ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค.
Table 1.4 Adapter-Based Containers
================================================================================
Container Implementation
Characteristics
================================================================================
stack vector, list, deque๋กœ ๊ตฌํ˜„
ํ•œ์ชฝ ๋์—์„œ๋งŒ push/pop ๊ฐ€๋Šฅ
--------------------------------------------------------------------------------
queue list, deque๋กœ ๊ตฌํ˜„
ํ•œ์ชฝ์—์„œ push, ๋‹ค๋ฅธ์ชฝ์—์„œ pop
--------------------------------------------------------------------------------
priority_queue vector๋‚˜ deque๋กœ ๊ตฌํ˜„
ํ•œ์ชฝ์—์„œ ์ž„์˜ ์ˆœ์„œ๋กœ push, ๋‹ค๋ฅธ ์ชฝ์—์„œ ์ €์žฅ๋œ ์ˆœ์„œ๋กœ pop
================================================================================
์ค‘์ฒฉ๋œ ํ…œํ”Œ๋ฆฟ ์„ ์–ธ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ints ์˜ค๋ธŒ์ ํŠธ๋ฅผ
๊ฐ–๋Š” dequeํด๋ž˜์Šค๋กœ ์Šคํƒ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ• ๋•Œ,
stack < deque< int>> aStack;
๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ„ ์„ ์–ธ์„ ํ•  ๋•Œ ์ฃผ์˜ํ•  ๊ฒƒ์€ ">>" ์‚ฌ์šฉ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
stack < deque< int>> aStack; // syntaxerror
์ฒ˜๋Ÿผ ์„ ์–ธํ•˜๋ฉด syntax error๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ >> ๋ฅผ shift ์—ฐ์‚ฐ์ž๋กœ
ํŒŒ์‹ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ์ธ "< < " ์˜ ์‚ฌ์šฉ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ด๋‹ค.
1.5 Algorithms
์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฝ˜ํ…Œ์ด๋„ˆ(๋˜๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค)์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ญ”๊ฐ€๋ฅผ ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด๋‹ค.
์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋“ฏ์ด STL์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฝ˜ํ…Œ์ด๋„ˆ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋„ ์•„๋‹ˆ๊ณ  ํ”„๋žœ๋“œ ํ•จ์ˆ˜๋„
์•„๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์ด๊ฒƒ ๋˜ํ•œ ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜๋“ค์ด๋‹ค. ๋”ฐ๋ผ์„œ C+
+ buit-in ๋ฐฐ์—ด์„ ์‚ฌ์šฉ ํ• ์ˆ˜ ๋„ ์žˆ๊ณ 
์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ์ฝ˜ํ…Œ์ด๋„ˆ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
ํ…Œ์ด๋ธ” 1.5๋Š” ๋ช‡๊ฐ€์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
Table 1.5 Some Typical Algorithms
================================================================================
Algorithm Purpose
================================================================================
find ์–ด๋–ค ๊ฐ’๊ณผ ๋™์ผํ•œ ์ตœ์ดˆ์˜ ๊ฐ’์„ ๋ฆฌํ„ด
--------------------------------------------------------------------------------
count ์—˜๋ฆฌ๋จผํŠธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฆฌํ„ด
--------------------------------------------------------------------------------
equal ๋‘ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๊ฐ™์œผ๋ฉด true๋ฅผ ๋ฆฌํ„ด
--------------------------------------------------------------------------------
search ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๊ฐ™์€ ์‹œํ€€์Šค value์˜ ์‹œํ€€์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
--------------------------------------------------------------------------------
copy ์‹œํ€€์Šค ๊ฐ’์„ ๋ณต์‚ฌ
--------------------------------------------------------------------------------
swap ๊ฐ’์„ ์„œ๋กœ ๋ฐ”๊พผ๋‹ค.
--------------------------------------------------------------------------------
iter_swap ์‹œํ€€์Šค ๊ฐ’์„ ์„œ๋กœ ๋ฐ”๊พผ๋‹ค.
--------------------------------------------------------------------------------
fill ์‹œํ€€์Šค์˜ ํŠน์ • ์œ„์น˜์— ๊ฐ’์„ ์ฑ„์šด๋‹ค.
--------------------------------------------------------------------------------
sort ์ง€์ •ํ•œ ์ˆœ์„œ๋กœ ์ •๋ ฌ์„ ํ•œ๋‹ค.
--------------------------------------------------------------------------------
merge ๋‘๊ฐœ์˜ ์ €์žฅ์†Œ๋ฅผ ๊ฒฐํ•ฉํ•œ๋‹ค.
--------------------------------------------------------------------------------
accumulate ์ฃผ์–ด์ง„ ๋ฒ”์œ„์˜ ๊ฐ’์„ ๋”ํ•œ๋‹ค.
--------------------------------------------------------------------------------
for_each ๊ฐ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ ๊ฐ’์„ ํƒ์ƒ‰
================================================================================
๋‹ค์Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” int ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž
int arr[8] ={ 42, 31, 7, 80, 2, 26, 19, 75};
STL์˜ sort ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์จ์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
sort (arr, arr+
8);
์œ„์—์„œ arr์€ arr์˜ ์‹œ์ž‘ ์ฃผ์†Œ์ด๊ณ  arr+
8์€ ๋ ์ฃผ์†Œ์ด๋‹ค.
iterator๋Š” ํฌ์ธํ„ฐ ๋น„์Šทํ•˜๊ฒŒ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ์•„์ดํ…œ(์—˜๋ฆฌ๋จผํŠธ)์„ ์•ก์„ธ์Šคํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ์ด๋‹ค.
์ฃผ๋กœ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๋ฐ˜๋ณต(iterating)์— ์˜ํ•ด ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์„ ํ˜• ์ด๋™ํ•˜๋Š”๋ฐ
์‚ฌ์šฉ๋œ๋‹ค. +
+์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ฆ๊ฐ€ํ•˜๋ฉด ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ
๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ญ์ฐธ์กฐ(dereference)์—ฐ์‚ฐ์ž *๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”
๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค. STL์—์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” iterator ํด๋ž˜์Šค๋กœ ํ‘œํ˜„๋œ๋‹ค.
์ฝ˜ํ…Œ์ด๋„ˆ์— ๋”ฐ๋ผ์„œ ์„œ๋กœ๋‹ค๋ฅธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋ฉฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ์ฃผ์š” 3 ๊ฐ€์ง€ ์ข…๋ฅ˜๋Š”
forward, bi-directional, random access ์ด๋‹ค.
forward ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์ƒ์—์„œ ํ•œ๋ฒˆ์— ํ•œ์•„์ดํ…œ์”ฉ ์ „๋ฐฉ ์ด๋™ ๋ฐ–์— ํ• ์ˆ˜ ์—†๋‹ค.
์ฆ‰, +
+์˜คํผ๋ ˆ์ดํ„ฐ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค. ์ ˆ๋Œ€ ํ›„๋ฐฉ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๊ณ  ์ฝ˜ํ…Œ์ด๋„ˆ ์ค‘๊ฐ„์œ„์น˜๋กœ์˜
์ž„์˜ ์„ค์ •์„ ํ•  ์ˆ˜ ์—†๋‹ค. bidirectional ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ „๋ฐฉ/ํ›„๋ฐฉ์œผ๋กœ ๋ชจ๋‘ ์ด๋™๊ฐ€๋Šฅํ•˜๋‹ค.
๋”ฐ๋ผ์„œ +
+์˜คํผ๋ ˆ์ดํ„ฐ์™€ --์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ •์˜๋˜์–ด ์žˆ๋‹ค. random access ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š”
์ „๋ฐฉ/ํ›„๋ฐฉ ์ด๋™๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž„์˜ ์œ„์น˜๋กœ ์ ํ”„ํ•  ์ˆ˜ ์žˆ๋‹ค.
1.6 Iterator Characteristics
================================================================================
Read/Write ์ €์žฅ๊ฐ€๋Šฅ ๋ฐฉํ–ฅ Access
================================================================================
Random Access R/W Yes ์ „๋ฐฉ/ํ›„๋ฐฉ Random
--------------------------------------------------------------------------------
Bidirectional R/W Yes ์ „๋ฐฉ/ํ›„๋ฐฉ Linear
--------------------------------------------------------------------------------
Forward R/W Yes ์ „๋ฐฉ Linear
--------------------------------------------------------------------------------
Output W No ์ „๋ฐฉ Linear
--------------------------------------------------------------------------------
Input R No ์ „๋ฐฉ Linear
================================================================================
1.7 STL์˜ ์ž ์žฌ์  ๋ฌธ์ œ(PotentialProblems with STL)
STL์˜ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด์„œ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๋ฌด๋ฆฌ๋ฅผ ์ฃผ์–ด (K:์›๋ฌธ์ด ์ด๋ ‡๊ฒŒ ์จ์žˆ๋Š”๋Œ€ ์•„๋งˆ๋„ ์ž˜๋ชป ์“ด๊ฑฐ ๊ฐ™์Œ)
๋จผ์ €, ํ—ค๋”ํ™”์ผ์— ํฌํ•จ๋˜์–ด ์žˆ์–ด์„œ ์—๋Ÿฌ ์ฐพ๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ์œ ์ € ์ฝ”๋“œ์˜
๋งค ๋ผ์ธ์— ์ฃผ์„์„ ๋‹ฌ์•„ ๋†“๋Š” ๊ธธ๋ฟ์ด๋‹ค. ํ”„๋ฆฌ์ปดํŒŒ์ผ๋“œ ํ—ค๋”์˜ ์‚ฌ์šฉ์œผ๋กœ ์ปดํŒŒ์ผ ์†๋„๊ฐ€
์—„์ฒญ๋‚˜๊ฒŒ ๋นจ๋ผ์ง€์ง€๋งŒ STL์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋Š๋ ค์ง€๊ฒŒ ํ•œ๋‹ค.
STL์€ ์•„๋งˆ๋„ ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์†Œ์‹ค ๋œ๋‹ค๊ณ  ๊ฒฝ๊ณ ๋ฅผ ๋‚ด์ง€๋งŒ ์ด ๊ฒฝ๊ณ ๋Š” ๋ฌด์‹œํ•˜๋˜์ง€ disable ์‹œ์ผœ๋ฒ„๋ฆฌ๋ฉด ๋œ๋‹ค.
2 Algorithms
STL์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ์ดํ„ฐ ์ฝœ๋ ‰์…˜์ƒ์—์„œ ์–ด๋–ค ์˜คํผ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€
STL์ฝ˜ํ…Œ์ด๋„ˆ์™€ ๋™์ž‘ํ•˜๋„๋ก ๋””์ž์ธ ๋˜์–ด์žˆ์ง€๋งŒ ๋ณดํ†ต C+
+ ๋ฐฐ์—ด์—๋„ ์ ์šฉ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
๋ฐฐ์—ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ• ๋•Œ ์ƒ๋‹น๋ถ€๋ถ„์˜ ๋…ธ๊ฐ€๋‹ค๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
2.1 The find()Algorithm
find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ค ๊ฐ’๋“ค์„ ๊ฐ€์ง„ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ์ผ์น˜ํ•˜๋Š” ์ฒซ๋ฒˆ์งธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฐพ๋Š”๋ฐ
์‚ฌ์šฉํ•œ๋‹ค. FIND ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์€ ints๋ฐฐ์—ด์—์„œ ์–ด๋–ป๊ฒŒ ์ฐพ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
// find.cpp
// finds the first object with a specified value
#include< iostream>
#include< algorithm> // forfind ()
using namespace std;
int arr[] ={ 11, 22, 33, 44, 55, 66, 77, 88};
int main ()
{
int *ptr;
ptr = find (arr, arr+
8, 33); // ๋งจ ์ฒ˜์Œ ๋‚˜ํƒ€๋‚˜๋Š” 33์„ ์ฐพ๋Š”๋‹ค.
cout << โ€œ33์„ ๊ฐ€์ง€๋Š” ์ฒซ๋ฒˆ์งธ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์œ„์น˜๋Š”โ€ << (ptr-arr) << endl;
return 0;
}
(K:VC+
+์—์„œ ํ•œ๋‹ค๋ฉด return 0; ๋ฐ”๋กœ์ „์— getchar(); ๊ฐ™์€๊ฑธ ์จ์ฃผ๊ฑฐ๋‚˜ ๋ธŒ๋ž˜์ดํฌ ํฌ์ธํŠธ๋ฅผ ์ฐ์–ด์•ผํ•จ.)
๊ฒฐ๊ณผ
33์„ ๊ฐ€์ง€๋Š” ์ฒซ๋ฒˆ์งธ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์œ„์น˜๋Š” 2
์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ algorithm ํ™”์ผ์„ ์ธํด๋ฃจ๋“œํ–ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ• ๊ฒƒ์€ STL์—์„œ
ํ—ค๋”ํ™”์ผ๋“ค์€ ํ™•์žฅ์ž(.H๋‚˜ .CP๊ฐ™์€P)๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
find()ํ•จ์ˆ˜์—์„œ ์ฒ˜์Œ ๋‘๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฒ”์œ„๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ C+
+ ํฌ์ธํ„ฐ๋ฅผ
์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ์—์„œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ด๋‹ค. ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฒซ๋ฒˆ์งธ
๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ(ํฌ์ธํ„ฐ)์ด๊ณ  ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋งˆ์ง€๋ง‰ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋งํ•œ๋‹ค.
์œ„ ์˜ˆ์ œ๋ฅผ C+
+์˜ for ๋ฃจํ”„๋กœ ๋‹ค์‹œ ํ‘œํ˜„ํ•˜๋ฉด
for (int j=0; j< 8; j+
+) // from 0to 7
{
if (arr[j] == 33)
{
cout << โ€œ33์„ ๊ฐ€์ง€๋Š” ์ฒซ๋ฒˆ์งธ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์œ„์น˜๋Š”โ€ << j << endl;
break;
}
}
FIND ์˜ˆ์ œ์˜ find()๋Š” for ๋ฃจํ”„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ์—†์• ์ค€๋‹ค. ์ข€๋” ๋ณต์žกํ•œ ์ƒํ™ฉ์—์„œ
์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„์ฃผ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ผ์„ ํ”ผํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.
2.2 The count()Algorithm
count()๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ํŠน์ •ํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋ช‡๊ฐœ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณธ๋‹ค.
COUNT ์˜ˆ์ œ๋ฅผ ๋ณด์ž.
//count.cpp
// countthe number of objects with a specified value.
#include< iostream>
#include< algorithm> // forcount()
using namespace std;
int arr[] ={ 33, 22, 33, 44, 33, 66, 77, 88};
int main()
{
int n =count (arr, arr+
8, 33); // 33์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ผ๋‹ค.
cout << โ€œ33์ด โ€ << n << โ€œ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค.โ€ << endl;
return 0;
}
๊ฒฐ๊ณผ:
33์ด 3๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค.
2.3 The sort() Algorithm
์•„๋งˆ sort() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ง์ž‘์ด ๊ฐˆ๊ฒƒ์ด๋‹ค. ๋ฐ”๋กœ SORT ์˜ˆ์ œ๋ฅผ ๋ณด์ž.
// sort.cpp
// integers ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค.
#include< iostream>
#include< algorithm>
using namespace std;
int arr[] ={ 45, 2, 22, -17, 0, -30, 25, 55};
int main()
{
sort (arr, arr+
8);
for (int j=0; j< 8; j+
+)
cout << arr[j] << " ";
return 0;
}
๊ฒฐ๊ณผ:
-30 -17 0 2 22 25 45 55
2.4 The search() Algorithm
์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•œ๋ฒˆ์— ๋‘๊ฐœ์˜ ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ ์ž‘์—…ํ•œ๋‹ค. find()์•Œ๊ณ ๋ฆฌ์ฆ˜์€
์‹ฑ๊ธ€ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์ด์ง€๋งŒ, search()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ค ํ•œ ์ฝ˜ํ…Œ์ด๋„ˆ์˜
์—ฐ์†๋˜๋Š” ๊ฐ’๋“ค(ํŒจํ„ด)์„ ๋‹ค๋ฅธ ํ•œ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ์ฐพ์•„๋ณธ๋‹ค.
// search.cpp
#include< iostream>
#include< algorithm>
using namespace std;
int source [] = {11, 44, 33, 11, 22, 33, 11, 22, 44};
int pattern[] ={11, 22, 33};
int main ()
{
int *ptr;
ptr = search(source,source+
9, pattern,pattern+
3);
if (ptr == source+
9)
cout << โ€œNo match foundnโ€;
else
cout << โ€œMatch at โ€ << (ptr-source) << endl;
return 0;
}
๊ฒฐ๊ณผ:
Match at 3
์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ’ ptr์ด source์˜ ๋๊นŒ์ง€ ๊ฐ”๋‹ค๋ฉด ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์†Œ๋ฆฌ์ด๋‹ค.
2.5 The merge() Algorithm
3๊ฐœ์˜ ์ฝ˜ํ…Œ๋„ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‘์—…์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ์จ 2๊ฐœ์˜ ์†Œ์Šค ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ํ•ฉํ•˜์—ฌ
๋ชฉ์  ์ฝ˜ํ…Œ์ด๋„ˆ์— ๋„ฃ๋Š”๋‹ค.
// merge.cpp
#include< iostream>
#include< algorithm>
using namespace std;
int src1[] = { 2, 3, 4, 6, 9 };
int src2[] = { 1, 3, 5 };
int dest[8];
int main()
{
// src1๊ณผ src2๋ฅผ dest๋กœ mergeํ•œ๋‹ค.
merge (src1, src1+
5, src2, src2+
3, dest);
for (int j=0; j< 8; j+
+)
cout << dest[j] << " ";
cout << endl;
return 0;
}
๊ฒฐ๊ณผ :
1 2 3 3 4 5 6 9
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์•Œ์ˆ˜ ์žˆ๋“ฏ์ด merge๋Š” ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
2.6 Function Objects
์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ธ์ž ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. ํ•จ์ˆ˜๊ฐ์ฒด๋Š” ๊ฒ‰์œผ๋กœ ๋ณด๊ธฐ์—”
ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ฒด๋Š” ()์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•œ ์‹ฑ๊ธ€ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ
(K:์˜ค๋ฒ„๋กœ๋“œ๋ž€ ํด๋ž˜์Šค์—์„œ ์—ฐ์‚ฐ์ž๋ฅผ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. Ex : C.Add(); -> C+
+;)
๊ฐ€์ง„ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค ๊ฐ์ฒด์ด๋‹ค. ์ด๊ฒƒ์€ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์•„์ฃผ ํŽธ๋ฆฌํ•˜๋‹ค.
๋ฐฐ์—ด์„ ascending(K:์˜ค๋ฅด๋Š”)์ด ์•„๋‹Œ descending์œผ๋กœ ์ •๋ ฌํ•˜๊ณ ์ž ํ•œ๋‹ค๊ณ  ํ•˜๊ณ  ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ๋ณด์ž.
// sortemp.cpp
#include<iostream>
#include<algorithm>
#include<functional>
usingnamespace std;
double fdata[] ={ 19.2, 87.4, 33.6, 55.0, 11.5, 42.2 };
int main()
{
sort ( fdata, fdata+
6, greater<double>());
for (int j=0; j< 6; j+
+)
cout << fdata[j] << " " << endl;
return 0;
}
sort() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ ascending order๋กœ ์ •๋ ฌํ•˜์ง€๋งŒ greater< >() ํ•จ์ˆ˜๊ฐ์ฒด๋Š”
์ •๋ ฌ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค.
๋”ฐ๋ผ์„œ ๊ฒฐ๊ณผ๋Š”
87.4 55 42.2 33.6 19.2 11.5
์ด ์™ธ์—๋„ ์‚ฐ์ˆ  ์ด๋‚˜ ๋…ผ๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜๊ฐ์ฒด๊ฐ€ ๋” ์žˆ์œผ๋‚˜, ๋’ค์—์„œ ์ž์„ธํ•˜๊ฒŒ ๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.
2.6.1 ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๊ฐ์ฒด
ํ•จ์ˆ˜๊ฐ์ฒด๋Š” ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค(+
,< ,==,..)๊ณผ ํ•จ๊ป˜ ๊ธฐ๋ณธ C+
+ ํƒ€์ž…๋“ค๊ณผ
ํด๋ž˜์Šค๋งŒ ์ ์šฉ์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜๋ฅผ
ํ•จ์ˆ˜๊ฐ์ฒด๋กœ ์“ฐ๊ณ ์ž ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜์ง€? ์˜ˆ๋กœ, < ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€
char* ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ์œ„ํ•ด์„œ ๋น„๊ตํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ฒจ์คŒ๋กœ์จ ํ•จ์ˆ˜๊ฐ์ฒด ๋Œ€์‹ 
์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.
// sortcmp.cpp
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
char *names[] ={"Geroge", "Penny", "Estelle", "Don", "Mike", "Bob"};
bool alpha_comp (char*, char*);
int main()
{
sort (names, names+
6, alpha_comp);
for (int j=0; j< 6; j+
+)
cout << names[j] << endl;
return 0;
}
bool alpha_comp (char *s1, char* s2) // s1< s2์ด๋ฉด true๋ฅผ ๋ฆฌํ„ด
{
return ( strcmp ( s1, s2) < 0 ) ? true : false;
}
sort()์—์„œ 3๋ฒˆ์งธ ์ธ์ž๋Š” alpha_comp ํ•จ์ˆ˜์˜ ์ฃผ์†Œ์ด๋‹ค. ์œ„์˜ ๊ฒฐ๊ณผ๋Š”
Bob
Don
Estelle
George
Mike
Penny
์ด๋‹ค. ์ฆ‰ ์ด๋ฆ„์„ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.
2.7 Adding _if to Algorithms
์•Œ๊ณ ๋ฆฌ์ฆ˜์ค‘์—๋Š” ๋์— _if๊ฐ€ ๋ถ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋‚˜
ํ•จ์ˆ˜์ธ ์†์„ฑ(predicate)์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ์˜ˆ๋กœ find()์•Œ๊ณ ๋ฆฌ์ฆ˜์€
์–ด๋–ค ํŠน์ •ํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๋Š”๋‹ค. ๋˜ํ•œ find_if()์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋„ ์–ด๋–ค ์ถ”์ƒ์ 
ํŠน์ง•์„ ๊ฐ€์ง€๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฐพ๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” string๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
find_if()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ string ์˜ค๋ธŒ์ ํŠธ ๋ฐฐ์—ด์—์„œ Don์ด๋ž€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” string์„ ์ฐพ๋Š”
isDon() ํ•จ์ˆ˜์˜ supprt๋ฅผ ๋ฐ›๋Š”๋‹ค. ์•„๋ž˜๋Š” FIND_IF์˜ ์ฝ”๋“œ์ด๋‹ค.
// find_if.cpp
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string names[] ={โ€œGerogeโ€,โ€Estelleโ€, โ€œDonโ€, โ€œMikeโ€, โ€œBobโ€};
/////////////////////////////////////////////////////////////////
bool isDon(string name)
{
return name == "Don";
}
/////////////////////////////////////////////////////////////////
int main()
{
string* ptr;
ptr = find_if (names, names+
5, isDon);
if (ptr == names+
5)
cout << "Done is not on the list" << endl;
else
cout << "Don is element " << (ptr-names)
<< " on the list." << endl;
return 0;
}
/////////////////////////////////////////////////////////////////
Don์€ ์‹ค์ œ list์— ์žˆ๊ธฐ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š”
Don iselement 2 on the list.
์ด๋‹ค.
์—ฌ๊ธฐ์„œ find_if()๋Š” ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ isDon()์œผ๋กœ ๋„˜๊ฒจ์ฃผ๊ณ  isDon์€ Don์„ ์ฐพ์œผ๋ฉด
true๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋˜๊ณ  find_if๋ฅผ ๋น ์ ธ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.
(K:Find()๋ฌธ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 3๋ฒˆ์งธ์— ์žˆ์œผ๋‹ˆ ์‹œ์ž‘์ด 0์ด๋ฏ€๋กœ 2๋ผ๊ณ  ํ‘œ์‹œ๋œ๋‹ค. )
์ด๋ฐ–์—๋„ _if๋ฒ„์ „์œผ๋กœ ์ ์šฉ๋ ์ˆ˜ ์žˆ๋Š” count(), replace(),remove()๋“ฑ๋“ฑ์ด ์žˆ๋‹ค.
2.8 The for_each()Algorithm
for_earch()๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ๋Œ€๋กœ ๋ญ”๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”
์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ญ”๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ์šฉ์ž ์ž‘์„ฑ ํ•จ์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ”๊ฟ€์ˆ˜๋Š” ์—†์ง€๋งŒ ์ฐธ์กฐ์™€ display๋Š” ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹ค์Œ ์˜ˆ์ œ๋Š” ์ธ์น˜๋ฅผ ์„ผํ‹ฐ๋ฏธํ„ฐ๋กœ ๋ฐ”๊พธ๊ณ  ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 2.54๋ฅผ ๊ณฑํ•˜๋Š” in_to_cm()ํ•จ์ˆ˜๋ฅผ
๋งŒ๋“ค๊ณ  for_each() ์˜ ์„ธ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์†Œ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
// for_each.cpp
#include<iostream>
#include<algorithm>
using namespace std;
void in_to_cm(double);
int main()
{
double inches[] ={ 3.5, 6.2, 1.0, 12.75, 4.33 };
for_each (inches,inches+
5, in_to_cm);
cout << endl;
return 0;
}
void in_to_cm(double in)
{
cout << (in * 2.54) << " ";
}
๊ฒฐ๊ณผ๋Š”
8.89 15.748 2.54 32.385 10.9982
2.9 The transform() Algorithm
transform()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ์—๊ฒŒ ๋ญ”๊ฐ€๋ฅผ ํ•˜๊ณ  ๋‹ค๋ฅธ ์ฝ˜๋„ค์ด๋„ˆ์—๊ฒŒ
(๋˜๋Š” ๊ฐ™์€ ์ฝ˜ํ…Œ์ด๋„ˆ์—๊ฒŒ)์ด ๊ฒฐ๊ณผ๋ฅผ ์ „์†กํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ž‘์„ฑํ•จ์ˆ˜๋Š” ์—˜๋ฆฌ๋จผํŠธ์—๊ฒŒ
๋ญ˜ํ• ๊ฑด์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์‚ฌ์šฉ์ž ์ž‘์„ฑํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์€ ์ž…๋ ฅํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
๋‹ค์Œ์˜ ์˜ˆ๋Š” FOR_EACH์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ double []๋กœ ์ €์žฅํ•œ๋‹ค.
// tranfo.cpp
#include<iostream>
#include<algorithm>
using namespace std;
double in_to_cm(double in)
{
return in * 2.54;
}
int main()
{
double inches[] ={ 3.5, 6.2, 1.0, 12.75, 4.33 };
double centi[5];
double in_to_cm(double); // prototype
transform (inches, inches+
5, centi, in_to_cm);
for (int j=0; j<5; j+
+)
cout << centi[j] << " " << endl;
return 0;
}
๊ฒฐ๊ณผ๋Š” FOR_EACH์™€ ๊ฐ™๋‹ค.
์ด์ œ๊นŒ์ง€ ๋‹จ์ง€ ๋ช‡๊ฐœ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์‚ดํˆ์ง€๋งŒ STL์—๋Š” ์ด๋ฐ–์—๋„ ์•„์ฃผ ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด
์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋‹จ์ง€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์‘์šฉ๊ฐ€๋Šฅํ•œ์ง€ ๋งŒ์„ ๋ณด์ธ ๊ฒƒ ๋ฟ์ด๋‹ค.
3 Sequential Containers
์ด๋ฏธ ์•ž์—์„œ ์‚ดํˆ๋“ฏ์ด STL ์ฝ˜ํ…Œ์ด๋„ˆ์—๋Š” 2๊ฐ€์ง€ ์ฃผ์š” ์นดํ…Œ๊ณ ๋ฆฌ๋กœ์จ sequence ์ฝ˜ํ…Œ์ด๋„ˆ
์™€ associative ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด๋ฒˆ ์žฅ์—์„œ๋Š” vector, list,deque์˜ 3๊ฐ€์ง€
์‹œํ€€์Šค ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  ์ด ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ
์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค. iterator์— ๋Œ€ํ•ด ์•„์ง์€ ์ž์„ธํ•˜๊ฒŒ ๋ฐฐ์šฐ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—
์œ„์˜ ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค. iterator์— ๋Œ€ํ•ด์„œ๋Š”
๋‹ค์Œ ์žฅ์—์„œ ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ๋„๋ก ํ•œ๋‹ค. ์•ž์œผ๋กœ ๋‚˜์˜ฌ ์˜ˆ์ œ๋“ค์€ ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ
์œ„ํ•ด ๋ช‡๊ฐ€์ง€ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋“ค๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ๊ธฐ์–ตํ•ด๋‘˜ ๊ฒƒ์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค๋„
๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค.
3.1 Vectors
๋ฒกํ„ฐ๋Š” ์˜๋ฆฌํ•œ ๋ฐฐ์—ด(smart array)์ด๋ผ ์ƒ๊ฐํ•ด๋„ ์ข‹๋‹ค. ๋ฒกํ„ฐ๋Š” ์ €์žฅ์†Œ๋ฅผ ํ• ๋‹นํ•˜๊ณ ,
๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ์— ๋”ฐ๋ผ ํฌ๊ธฐ๋ฅผ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œ์‹œํ‚จ๋‹ค. ๋ฒกํ„ฐ๋ฅผ []์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ
์จ์„œ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ๋ฒกํ„ฐ์—์„œ ์ด๋Ÿฌํ•œ ์ž„์˜์ ‘๊ทผ์€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ž‘๋™ ํ•œ๋‹ค.
๋˜ํ•œ push๋ฅผ ์ด์šฉํ•ด์„œ ๋ฒกํ„ฐ์˜ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด
(์ถ”๊ฐ€๋˜๊ธฐ ์ง์ „์—) ํฌ๊ธฐ๋„ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค.
3.1.1 Member Functions push_back(),size(), and operator[]
์ฒซ๋ฒˆ์งธ ์˜ˆ์ œ๋กœ VECTOR๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฒกํ„ฐ ์˜คํผ๋ ˆ์ด์…˜์„ ๋ณด์—ฌ์ค€๋‹ค.
//vector.cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector< int> v; // ints ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
v.push_back(10); // ๋ฐฐ์—ด์˜ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
v.push_back(11); v.push_back(12); v.push_back(13);
v[0] = 20; v[3] = 23; // ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋Œ€์น˜
for (int j=0; j< v.size(); j+
+) // ๋ฒกํ„ฐ์˜ ๋‚ด์šฉ๋ฌผ์„ ์ถœ๋ ฅ
cout << v[j] << " " ;
return 0;
}
๋ฒกํ„ฐ v๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ฒกํ„ฐ์˜ ๊ธฐ๋ณธ์ƒ์„ฑ์ž(no-argument)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
์ฝ˜ํ…Œ์ด๋„ˆ์˜ ํฌ๊ธฐ๋ฅผ ์•Œ์ˆ˜ ์—†์œผ๋ฏ€๋กœ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. push_back()๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๋ฒกํ„ฐ์˜
๋์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค. list๋‚˜ queue์ฒ˜๋Ÿผ ๋ฒกํ„ฐ์˜ ์‹œ์ž‘๋ถ€(index=0)์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…
ํ•  ์ˆ˜ ์—†๋‹ค. ์˜ˆ์ œ์—์„  10, 11, 12, 13์„ ์ถ”๊ฐ€ ํ–ˆ์œผ๋ฏ€๋กœ v[0]์€ 10, v[1] = 11,
v[2] = 12, v[3]=13์ด๋‹ค. ์ผ๋‹จ ๋ฒกํ„ฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด [] ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด
์ฝ๊ณ  ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์˜ˆ์ œ์—์„œ ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ v[0]=20์œผ๋กœ ๋ฐ”๊พธ๊ณ , v[3] = 23์œผ๋กœ
๋ฐ”๊ฟจ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ์ œ์˜ ๊ฒฐ๊ณผ๋Š”
20 11 12 23
์ด ๋œ๋‹ค.
size() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๋ฒกํ„ฐ์˜ ์—˜๋ฆฌ๋จผํŠธ ๊ฐฏ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
์˜ˆ์ œ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋กœ๋Š” max_size()๊ฐ€ ์žˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€
ํ™•์žฅ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ด ์ˆ˜์น˜๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ํ‹€๋ ค์ง€
๊ฒŒ ๋œ๋‹ค. vector< int>์˜ max_size()๋Š” 1,073,741,823์„ ๋ฆฌํ„ดํ•  ๊ฒƒ์ด๋‹ค.
3.1.2 Member Functions swap(),empty(), back() and pop_back()
๋‹ค์Œ์˜ VECTOR๋Š” ๋ฒกํ„ฐ์˜ ์ถ”๊ฐ€์ ์ธ ์ƒ์„ฑ์ž์™€ ๋ฉค๋ฒ„ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃฌ๋‹ค.
//vectcon.cpp
#include< iostream>
#include< vector>
using namespace std;
int main()
{
double arr[] ={1.1, 2.2, 3.3, 4.4};
vector< double> v1(arr,arr+
4); // ๋ฒกํ„ฐ๋ฅผ arr๋กœ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค.
vector< double> v2(4); // ํฌ๊ธฐ๊ฐ€ 4์ธ empty ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
v1.swap (v2); // v1๊ณผ v2์˜ ๊ฐ’์„ ๋งž๋ฐ”๊พผ๋‹ค.
while (!v2.empty()) // v2๊ฐ€ ๋นŒ(empty)๋•Œ ๊นŒ์ง€
{
cout << v2.back() << " "; // ๋งˆ์ง€๋ง‰ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ display
v2.pop_back(); // ๋งˆ์ง€๋ง‰ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ญ์ œ
}
return 0;
}
์œ„์—์„œ ๋‘๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋ฐฑํ„ฐ์˜ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์ฒซ๋ฒˆ์งธ ๋ฒกํ„ฐ v1์€ ๋ณดํ†ต C+
+ ๋ฐฐ์—ด
์„ ๊ฐ€์ง€๊ณ  ์ดˆ๊ธฐํ™” ์‹œ์ผฐ๊ณ , ๋‘๋ฒˆ์งธ ๋ฒกํ„ฐ v2๋Š” ํฌ๊ธฐ๋งŒ ๊ฒฐ์ •ํ•˜์˜€๋‹ค.
swap()๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ์—˜๋ฆฌ๋จผํŠธ์˜ order๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ”๊พธ๊ฒŒ ๋œ๋‹ค.
์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ v2์™€ v1์˜ ๊ฐ’์„ ๋ฐ”๊ฟจ๊ธฐ ๋•Œ๋ฌธ์— v2๋ฅผ display์‹œ์ผœ๋ณด๋ฉด ๊ฒฐ๊ณผ๋Š”
4.4 3.3 2.2 1.1
์ด ๋œ๋‹ค.
back() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๋ฒกํ„ฐ์˜ ๋งจ ๋์— ์žˆ๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. pop_back() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š”
๋ฒกํ„ฐ์˜ ๋งจ ๋์— ์žˆ๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฃจํ”„๋Š” ๋ฉ”๋ฒˆ ๋‹ค๋ฅธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถœ๋ ฅ
ํ•˜๊ฒŒ ๋œ๋‹ค. swap() ๊ฐ™์€ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๋˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋„ ์กด์žฌํ•œ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
๋ฒ„์ „๋ณด๋‹ค๋„ ํ•ด๋‹น ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๊ฐ€ ๋” ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋œ ๊ฒƒ์ด๋‹ค. ๋•Œ๋•Œ๋กœ
์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ swap()์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋กœ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ๊ตํ™˜ํ• ์ˆ˜๋„ ์žˆ๋‹ค.
3.1.3 Member Functions insert()and erase()
insert()์™€ erase()๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์ƒ์˜ ์ž„์˜์˜ ์œ„์น˜์— ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ
์ œ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์€ ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ insert๋‚˜ remove๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ
๋“ค์„ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ๊ทธ๋Ÿผ์—๋„
๋ถˆ๊ตฌํ•˜๊ณ  ์†๋„์™ธ์—๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ฒˆ ์˜ˆ์ œ๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”
์ง€๋ฅผ ๋ณด์ธ๋‹ค.
//vectins.cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int arr[] ={100, 110, 120, 130};
vector< int> v(arr, arr+
4); // ๋ฒกํ„ฐ๋ฅผ arr๋กœ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค.
cout << "Before insertion : ";
for (int j=0; j< v.size(); j+
+)
cout << v[j] << " ";
cout << endl;
v.insert (v.begin()+
2, 115);
cout << "After insertion : ";
for (j=0; j< v.size(); j+
+)
cout << v[j] << " ";
cout << endl;
v.erase (v.begin()+
2);
cout << "After erasure : ";
for (j=0; j< v.size(); j+
+)
cout << v[j] << " ";
cout << endl;
return 0;
}
๊ฒฐ๊ณผ:
Before insertion: 100 110 120 130
After insertion: 100 110 115 120 130
After erasure: 100 110 120 130
3.2 Lists
STL์˜ list ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” doubly linked list๋กœ์จ, ๊ฐ ์—˜๋ฆฌ๋จผํŠธ๋“ค์€ ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ์˜
ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด์ „ ์—˜๋ฆฌ๋จผํŠธ์˜ ํฌ์ธํ„ฐ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ฝ˜ํ…Œ์ด๋„ˆ๋Š”
์–‘์ชฝ์œผ๋กœ ๋น ๋ฅธ ์ ‘๊ทผ์„ ์œ„ํ•ด ์—˜๋ฆฌ๋จผํŠธ์˜ ์•ž์ชฝ๊ณผ ๋’ค์ชฝ ๋ชจ๋‘๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.
3.2.1 Member Functions push_front(),front(), and pop_front()
์ฒซ๋ฒˆ์งธ ์˜ˆ์ œ์ธ LIST๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์ฝ์–ด์˜ค๊ณ  ๋นผ๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค.
// list.cpp
#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int> ilist;
ilist.push_back(30); ilist.push_back(40); ilist.push_front(20); ilist.push_front(10);
int size = ilist.size();
for (int j=0; j<size; j+
+) {
cout << ilist.front() << " ";
ilist.pop_front();
}
cout << endl;
return 0;
}
๋ฐ์ดํ„ฐ๋ฅผ ์œ„,์•ž์—์„œ ์ถ”๊ฐ€ ํ•œ๋‹ค์Œ ์•ž์ชฝ๋ถ€ํ„ฐ displayํ•˜๊ณ  ์‚ญ์ œํ•˜์˜€๋‹ค. ๊ฒฐ๊ณผ๋Š”
10 20 30 40
์ด๋‹ค.
push_front(),pop_front(),front()๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์•ž์—์„œ ๋‹ค๋ฃฌ ๋ฒกํ„ฐ์˜ push_back(),
pop_back(), back()๊ณผ ์œ ์‚ฌํ•˜๋‹ค. (K:๋‹ค๋งŒ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์•ž๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌ ํ•œ๋‹ค๋Š”๊ฒƒ๋งŒ ๋‹ค๋ฅด๋‹ค)
๋ฆฌ์ŠคํŠธ๋Š” ๋žœ๋ค ์•ก์„ธ์Šค ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์ŠคํŠธ๋กœ ๋žœ๋ค ์•ก์„ธ์Šค๋Š” ํ”ผํ•ด์•ผ ํ•จ์„ ์ฃผ๋ชฉํ•ด์•ผํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ์ด์œ ๋•Œ๋ฌธ์— ๋ฆฌ์ŠคํŠธ์—๋Š” [] ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์—†๋‹ค. ์ •๋ง๋กœ ๋žœ๋ค ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฉด
vector๋‚˜ deque๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ์ค‘๊ฐ„์— ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฝ์ž… ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
์—˜๋ฆฌ๋จผํŠธ์˜ ์ถ”๊ฐ€, ์‚ฝ์ž…์„ ์œ„ํ•ด ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
vector๋‚˜ deque์— ๋น„ํ•ด ํšจ์œจ์„ฑ์€ ๋–จ์–ด์ง€์ง€๋งŒ ํฌ์ธํ„ฐ๋งŒ ์ด๋™ํ•˜๋ฏ€๋กœ ๋น ๋ฅธํŽธ์— ์†ํ•œ๋‹ค.
(๋ฌธ์ œ์ ์€ ์ถ”๊ฐ€,์‚ญ์ œ ํฌ์ธํ„ฐ๋ฅผ ์ฐพ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค)
3.2.2 Member Functions reserve(),merge(), and unique()
์–ด๋–ค ๋ฉค๋ฒ„ํ•จ์ˆ˜๋“ค์€ list์—๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ์˜ˆ์ œ
LISTPLUS๋Š” ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.
// listplus.cpp
#include<iostream>
#include<list>
using namespace std;
int main()
{
int j;
list <int> list1, list2;
int arr1[] = {40, 30, 20, 10 };
int arr2[] = {15, 20, 25, 30, 35 };
for (j=0; j<4; j+
+)
list1.push_back( arr1[j]);
for (j=0; j<5; j+
+)
list2.push_back( arr2[j]);
list1.reverse(); // list1์˜ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค.
list1.merge(list2); // list1์— list2๋ฅผ ํฌํ•จ์‹œํ‚จ๋‹ค.
list1.unique(); // ์ค‘๋ณต๋˜๋Š” ๊ฐ’์„ ์ œ๊ฑฐํ•œ๋‹ค. 20, 30
int size = list1.size();
while (!list1.empty())
{
cout << list1.front() << " ";
list1.pop_front();
}
cout << endl;
return 0;
}
์ฒซ๋ฒˆ์งธ ๋ฆฌ์ŠคํŠธ๋Š” ์—ญ์ˆœ์œผ๋กœ ์ž…๋ ฅ๋˜์—ˆ๊ธฐ์— reverse()๋ฅผ ํ†ตํ•ด ์ •๋ ฌ์„ ํ•˜์˜€๋‹ค(์ด ๋™์ž‘์€
์–‘ ๋์„ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๋งค์šฐ ๋น ๋ฅด๋‹ค.). merge()๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ €
๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•ด์•ผ๋งŒํ•œ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ ๊ฒฐ๊ณผ๋Š”
10 20 30 40
15 20 25 30 35
์ด๋‹ค. ์ด์ œ merge() ํ•จ์ˆ˜๋กœ list1๊ณผ list2๋ฅผ ๋ณ‘ํ•ฉํ•˜๋ฉด ์ •๋ ฌ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ณ‘ํ•ฉ๋œ๋‹ค.
10 15 20 20 25 30 30 35 40
๋งˆ์ง€๋ง‰์œผ๋กœ list1์— unique() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ ์šฉ์‹œํ‚จ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๊ทผ์ ‘ํ•œ ์—˜๋ฆฌ๋จผํŠธ๋“ค์ด
๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์งˆ ๊ฒฝ์šฐ ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ•˜๋‚˜๋งŒ ๋‚จ๊ธด๋‹ค. ๋”ฐ๋ผ์„œ list1์˜ ๋‚ด์šฉ์€
10 15 20 25 30 35 40
์ด ๋œ๋‹ค. ์ด ๊ฐ’์„ displayํ•˜๊ธฐ ์œ„ํ•ด front()์™€ pop_front()๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.
3.3 Deques
์–ด๋–ค ๋ฉด์—์„œ deque๋Š” vector์™€ ๋น„์Šทํ•˜๊ณ  ๋˜ ์–ด๋–ค ๋ฉด์—์„œ๋Š” list์™€ ๋น„์Šทํ•˜๋‹ค. vector์ฒ˜๋Ÿผ
[] ์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์ง€์›ํ•˜๊ณ  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ list์ฒ˜๋Ÿผ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์•ž๋’ค์—์„œ
์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, deque๋Š” push_front(), pop_front(), front()๋ฅผ ์ง€์›ํ•˜๋Š”
double-ended vector์˜ ์ผ์ข…์ด๋‹ค.
๊ทธ๋ ‡์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฒกํ„ฐ์™€ ํ์™€ ๋‹ค๋ฅด๊ฒŒ ํ• ๋‹น์ด ๋œ๋‹ค. ๋ฒกํ„ฐ๋Š” ํ•ญ์ƒ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—
ํ• ๋‹น์ด ๋œ๋‹ค. ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง€๋ฉด ํฌ๊ธฐ๊ฐ€ ์•Œ๋งž๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค.
๋ฐ˜๋ฉด์— deque๋Š” ๋น„์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ(called segment)์— ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค. capacity()
๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์—˜๋ฆฌ๋จผํŠธ ๋ฒกํ„ฐ๊ฐ€ ์ด๋™์—†์ด ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ
deque์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ด๋™๋  ํ•„์š”๊ฐ€ ์—†๊ธฐ๋•Œ๋ฌธ์— capacity()๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.
//deque.cpp
#include <iostream>
#include <deque>
using namespace std;
int main()
{
deque<int> deq;
deq.push_back(30); // push items on back
deq.push_back(40);
deq.push_back(50);
deq.push_front(20); // push items on front
deq.push_front(10);
deq[2] = 33; // change middle item
for (int j=0; j<deq.size(); j+
+)
cout << deq[j] << ' '; // display items
cout << endl;
return 0;
}
์•ž์—์„œ ์ด๋ฏธ push_back(), push_front(), operator []๋ฅผ ๋ฐฐ์› ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ
์„ค๋ช…์ด ํ•„์š”์—†๋‹ค. deque๋„ ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ์ฒ˜๋Ÿผ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค. ๊ฒฐ๊ณผ๋Š”
10 20 33 40 50
์ด๋‹ค.
4. Iterators
์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์กฐ๊ธˆ ์‹ ๋น„์Šค๋Ÿฝ๊ฒŒ ๋ณด์ด๋ฉฐ์„œ STL์˜ ํ•ต์‹ฌ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์ด๋ฒˆ ์žฅ์—์„œ๋Š”
์šฐ์„  ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜-์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๋‘๊ฐ€์ง€ ์—ญํ• ์—
๋Œ€ํ•ด ๋‹ค๋ฃจ๊ฒŒ ๋œ๋‹ค. ๋ฌผ๋ก  ์‚ฌ์šฉ๋ฒ•์€ ๋ช‡๋ช‡ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋ณด๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค.
4.1 Iterators as Smart Pointers
์ข…์ข… ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ชจ๋“ (๋˜๋Š” ์ผ๋ถ€ ์˜์—ญ) ์—˜๋ฆฌ๋จธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‘์—…์„ ํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.
์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๊ฐ๊ฐ์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ displayํ•˜๊ฑฐ๋‚˜ total์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’์„ ๋”ํ•˜๊ธฐ๋„
ํ•œ๋‹ค. ์ „ํ†ต C+
+ ๋ฐฐ์—ด์—์„œ ์ด๋Ÿฌํ•œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ํฌ์ธํ„ฐ๋ฅผ(๋˜๋Š” [] ์˜คํผ๋ ˆ์ดํ„ฐ) ์ด์šฉํ•˜์—ฌ
๊ตฌํ˜„๋˜์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” float ๋ฐฐ์—ด์„ ์ˆœํšŒ(iterates)ํ•˜๊ณ  ๊ฐ ์—˜๋ฆฌ๋จธํŠธ์˜
๊ฐ’์„ ๋ณด์—ฌ์ค€๋‹ค.
float * ptr = start_address;
for (int j=0; j<SIZE; j+
+)
cout << *ptr+
+;
ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด * ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์˜€๊ณ , ๋‹ค์Œ ํฌ์ธํ„ฐ๋ฅผ
๊ฐ€๋ฆฌํ‚ค๊ธฐ ์œ„ํ•ด +
+ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.
4.1.1 Ordinary Pointers Underpowered
๊ทธ๋Ÿฌ๋‚˜, ๊ณ ๊ธ‰ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์—์„œ, ํ‰๋ฒ”ํ•œ C+
+ ํฌ์ธํ„ฐ๋Š” ์œ ์šฉํ•˜์ง€ ๋ชปํ•˜๋‹ค. ๋งŒ์ผ ์ฝ˜ํ…Œ์ด๋„ˆ์—
์ €์žฅ๋œ ์•„์ดํ…œ์ด ์—ฐ์†(contigious) ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํฌ์ธํ„ฐ ์ทจ๊ธ‰์ด ๋”์šฑ๋”
๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ๋‹ค์Œ ์•„์ดํ…œ์œผ๋กœ ์ด๋™ํ• ๋•Œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ
์•„์ดํ…œ์ด ๋ฐ”๋กœ ์˜†์— ์žˆ๋‹ค๊ณ  ์˜ˆ์ธกํ•  ์ˆ˜๊ฐ€ ์—†๊ธฐ๋•Œ๋ฌธ์— ์ฒ˜์Œ๋ถ€ํ„ฐ ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์œ„์น˜๋ฅผ
๋จผ์ € ์ฐพ์•„๊ฐ€์•ผ๋งŒ ํ•œ๋‹ค.
๋˜ํ•œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ ์ฃผ์†Œ๋„ ์ €์žฅํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค.
์ด ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ดํ›„์— ์ด ๊ฐ’์„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ค‘๊ฐ„์—์„œ ๊ฐ’์„
์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ–ˆ์„ ๊ฒฝ์šฐ ์ด ์ฝ˜ํ…Œ์ด๋„ˆ์— ๋ฌด์Šจ ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ? ์•„๋งˆ๋„ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ฝ˜ํ…์ธ ๊ฐ€
์žฌ์ •๋ ฌ ๋˜์ง€ ์•Š๋Š” ์ด์ƒ ์—ฐ์†์„ฑ์ด ๋Š์–ด์ง€๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ์‹œ ์ €์žฅ๋œ ํฌ์ธํ„ฐ๊ฐ’์˜
๋ณ€๊ฒฝ์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋ฉด ์ฐธ ์ข‹์„ ๊ฒƒ์ด๋‹ค.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•œ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ "smart pointer"ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค.
์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์ „ํ†ต์ ์ธ ํฌ์ธํ„ฐ๋กœ ๊ฐ์‹ผ๋‹ค. ๊ทธ๋ฆฌ๊ณ 
+
+์™€ * ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค์€ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๋น„๋ก ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋น„์—ฐ์†์ผ์ง€๋ผ๋„ ์–ด๋–ป๊ฒŒ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ
๋‹ค๋ฃฐ์ง€๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•œ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์ œ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ๊ณจ๊ฒฉ๋งŒ ๋‚˜ํƒ€๋‚ธ๊ฒƒ์ด๋‹ค.
class SmartPointer
{
private:
float *p; // ํ‰๋ฒ”ํ•œ ํฌ์ธํ„ฐ
public:
float operator*() {}
float operator+
+{}
};
void main()
{
...
SmartPointer sptr = start_address;
for (int j=0; j<SIZE; j+
+)
cout << *ptr+
+;
}
4.1.2 Whoes Responsibility? (๋ˆ„๊ฐ€ ์ฑ…์ž„์ง€์ง€?)
SmartPointer ํด๋ž˜์Šค๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— ์†Œ์†(embed) ๋˜์–ด์•ผ๋งŒ ํ•˜๋‚˜? ์•„๋‹ˆ๋ฉด ๋…๋ฆฝ์ ์ด์–ด์•ผ๋งŒ ํ•˜๋‚˜?
STL์ด ์„ ํƒํ•œ ํ•ด๊ฒฐ์ ์€ SmartPointer(์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”)๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์™€
์™„์ „ํžˆ ๋…๋ฆฝ๋˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค(์‚ฌ์‹ค ํ…œํ”Œ๋ฆฟํ™” ํ•œ๊ฒƒ์ด๋‹ค).
4.1.3 ์ธํ„ฐํŽ˜์ด์Šค๋กœ์จ์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ(Iterators as an Interface)
์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๋ง๊ณ , ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” STL์—์„œ
๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋  ์ˆ˜
์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ์™œ ํ•„์š”ํ• ๊นŒ?
์ด๋ก ์  ์„ผ์Šค๋กœ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋ชจ๋“  ์ฝ˜ํ…Œ์ด๋„ˆ์— ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด
๋“ค๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด STL์˜ ๊ฑฐ์˜ ๋ชจ๋“  ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜
์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ์—๊ฒŒ๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์ (์ฆ‰ slow)์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค. sort()์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜ˆ๋กœ
๋“ค์ž๋ฉด, ์ •๋ ฌ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋žœ๋ค์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋žœ๋ค์•ก์„ธ์Šค๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ
์—์„œ๋Š” ๋ฌด์กฐ๊ฑด ์ฒ˜์Œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•ด์„œ ์ •๋ ฌ์„ ์‹œ๋„ํ•ด์•ผ๋งŒ ํ• ๊ฒƒ์ด๋‹ค. -_-; ๋น„์Šทํ•œ ์˜ˆ๋กœ reverse()
์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋’ค์—์„œ(backword)๋ถ€ํ„ฐ ์•ก์„ธ์Šค๊ฐ€ ์ง€์›๋˜์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.
์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋†€๋ž๋„๋ก ๋ฉ‹์ง„ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ ํ•ฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉ์‹œํ‚จ๋‹ค.
์•ž์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์ปดํ“จํ„ฐ์™€ ํ”„๋ฆฐํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ผ€์ด๋ธ”์ด๋ผ ์ƒ๊ฐํ•ด๋ณด์ž.
์ผ€์ด๋ธ” ํ•œ์ชฝ ๋์— ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ํ”Œ๋Ÿฌ๊ทธํ•˜๊ณ  ๋‹ค๋ฅธ ํ•œ์ชฝ์—” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ”Œ๋Ÿฌ๊ทธํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ
๋ชจ๋“  ์ผ€์ด๋ธ”๋“ค์ด ๋ชจ๋“  ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ํ”Œ๋Ÿฌ๊ทธํ•  ์ˆ˜๋Š” ์—†๊ณ  ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ”Œ๋Ÿฌ๊ทธ ํ• ์ˆ˜๋„ ์—†๋‹ค.
๋งŒ์ผ ์ฃผ์–ด์ง„ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๋„ˆ๋ฌด ๋ฌด๋ฆฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ ค ํ•œ๋‹ค๋ฉด, ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ
์ผ€์ด๋ธ”(์ดํ„ฐ๋ ˆ์ดํ„ฐ)์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค. ์ด๊ฑธ ์ปดํŒŒ์ผ ํ•ด๋ณด๋ฉด ์•„๋งˆ ์ปดํŒŒ์ผ๋Ÿฌ ์—๋Ÿฌ๋ฅผ ๋ณด๊ฒŒ๋ ๊ฒƒ์ด๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ์ด์Šคํ‚ด์„ ์ž‘๋™์‹œํ‚ฌ๋ ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ข…๋ฅ˜์˜ ์ผ€์ด๋ธ”(์ดํ„ฐ๋ ˆ์ดํ„ฐ)๋“ค์ด ํ•„์š”ํ•˜๊ฒŒ ๋ ๊นŒ?
ํ†ตํ„ธ์–ด์„œ 5๊ฐœ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆผ 4.3์€ ์ด 5๊ฐ€์ง€ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ๊ทธ๋ฆผ์€ ์ •๊ตํ•˜๊ฒŒ ํ•˜๊ธฐ
์œ„ํ•ด ๋ฐ‘์—์„œ ๋ถ€ํ„ฐ ์œ„๋กœ ์ •๋ ฌ๋œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ์ƒ์†๊ด€๊ณ„๋Š” ์•„๋‹ˆ๋‹ค.
+
-----------------+
| Random Access |
+
-----------------+
|
+
-----------------+
| Bidirectional |
+
-----------------+
|
+
-----------------+
| Forward |
+
-----------------+
| |
+
-+ +
-+
| |
+
-------------+ +
-------------+
| Input | | Output |
+
-------------+ +
-------------+
๊ทธ๋ฆผ 1.3 ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์นดํ…Œ๊ณ ๋ฆฌ
๋งŒ์ผ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด readingํ•˜๋Š”๋ฐ(writing์ œ์™ธ) ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ „๋ฐฉ์ฐธ์กฐ๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด
์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” Input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ ๊ฒƒ์ด๋‹ค.์‚ฌ์‹ค
Input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒŒ์ผ์—์„œ ์ฝ์„๋•Œ๋‚˜ cin์œผ๋กœ ์ฝ์„ ๋•Œ๋„ ์ ์šฉ๋  ์ˆ˜
์žˆ๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ „๋ฐฉ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ฝ๋Š” ๊ฒƒ ๋Œ€์‹ ์— ์“ฐ๋Š”๊ฒŒ ํ•„์š”ํ•˜๋‹ค๋ฉด
output ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ด๋‹ค. Output ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋„ Input์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
ํŒŒ์ผ์ด๋‚˜ cout์œผ๋กœ writeํ• ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด์ด๋„ˆ์˜ ์ „๋ฐฉ์ˆœํšŒ๋ฅผ ํ•˜๊ณ  ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋‘˜๋‹ค ์ง€์›ํ•˜๊ฒŒ ์‹ถ์„ ๋•Œ๋Š” forward
์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ „๋ฐฉ/ํ›„๋ฐฉ ์ˆœํšŒ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” bidirectional
์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์•„๋ฌด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š”
random ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์•„๋ฌด ์—˜๋ฆฌ๋จผํŠธ๋‚˜ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋Š”
๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜๋‹ค. ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฐ์ˆ  ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
iter2 = iter1 + 7;
Table 1.7 Capabilities of Different Iterator Categories
========================================================================
Step Step Random
Forward Read Write Back Access
Iterator Type +
+ value=*i *i=value -- [n]
========================================================================
Random access x x x x x
------------------------------------------------------------------------
Bidirectional x x x x
------------------------------------------------------------------------
Forward x x x
------------------------------------------------------------------------
Output x x
-----------------------------------------------------------------------
input x x
========================================================================
์œ„Table์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ชจ๋“  ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ค์ด ์ „๋ฐฉ์ˆœํšŒ๋ฅผ ํ•˜๋Š” +
+์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค.
input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ดํ€„ํ‘œ์‹œ ์˜ค๋ฅธ์ชฝ์—์„œ * ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(์™ผ์ชฝ์€ ์•ˆ๋œ๋‹ค)
value = *iter;
output ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” * ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์˜ค๋กœ์ง€ ์˜ค๋ฅธ์ชฝ์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
*iter = value;
์ „๋ฐฉ์ˆœํšŒ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ชจ๋‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ณ , ๋‘๋ฐฉํ–ฅ(bidirectional) ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š”
์ฆ๊ฐ์„ ์ด์šฉํ•˜์—ฌ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๊ฐ„๋‹จํ•œ ์‚ฐ์ˆ  ์˜คํผ๋ ˆ์ดํ„ฐ์ธ
- ๋‚˜ + ์ฒ˜๋Ÿผ [] ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์จ์„œ ์•„๋ฌด ์—˜๋ฆฌ๋จผํŠธ๋‚˜ ์ฆ‰์‹œ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์ผ ์ „๋ฐฉ์ˆœํšŒ๊ฐ€ ํ•„์š”ํ• ๋•Œ,
๋‘๋ฐฉํ–ฅ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋‚˜ ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
4.2 Matching Algorithms with Containers
์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ผ€์ด๋ธ” ๊ฐœ๋…์œผ๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ
์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ์ƒ์ƒ์˜ ์ผ€์ด๋ธ” ์–‘๋์— ์ด›์ ์„ ๋งž์ถฐ๋ณด์ž. (์–‘๋์€ ์ฝ˜ํ…Œ์ด๋„ˆ์ธก๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
์ธก์„ ์–˜๊ธฐํ•œ๋‹ค)
4.2.1 ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—ฐ๊ฒฐ (Plugging the cable into a Container)
๋งŒ์•ฝ ์Šค์Šค๋กœ ๊ธฐ๋ณธ STL ์ฝ˜ํ…Œ์ด๋„ˆ ๋ฒ”์œ„๋กœ๋งŒ ํ•œ์ •ํ•˜์—ฌ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹จ ๋‘๊ฐ€์ง€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ
์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์•„๋ž˜์˜ํ…Œ์ด๋ธ” 1.8์„ ๋ณด๋ฉด ๋ฒกํ„ฐ์™€ ํ๋Š” ์–ด๋–ค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“  ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๊ณ ,
๋ฐ˜๋ฉด์— list, set, multiset, map, multimap์€ ๋žœ๋ค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋งŒ ์ˆ˜์šฉํ•  ์ˆ˜
์žˆ์Œ์„ ์•Œ์ˆ˜ ์žˆ๋‹ค.
Table 1.8 Iterator Types Accepted by Containers
========================================================================
vector List Deque Set Multiset Map Multimap
========================================================================
Random access x x
------------------------------------------------------------------------
Bidirectional x x x x x x x
------------------------------------------------------------------------
Forward x x x x x x x
------------------------------------------------------------------------
Output x x x x x x x
------------------------------------------------------------------------
input x x x x x x x
========================================================================
๊ทธ๋ ‡๋‹ค๋ฉด STL์€ ์–ด๋–ป๊ฒŒ ์ฃผ์–ด์ง„ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์•Œ๋งž๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ• ๊ฒƒ์ธ์ง€๋ฅผ ๋ช…์‹œํ•ด์ค˜์•ผ๋งŒ
ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, intํ˜•์„ ์ˆ˜์šฉํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด,
lint<int> iList; // list of ints
๋ผ๊ณ  ์„ ์–ธํ•˜๊ณ , ์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์ฒ˜๋Ÿผ ํ• ๊ฒƒ์ด๋‹ค.
list<int>::iterator iter; // iterator to list-of-ints
์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด, STL์€ ์ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ list์—๊ฒŒ ์š”๊ตฌ๋˜๋Š” bidirectional(์Œ๋ฐฉ)
์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค. vector๋‚˜ deque์— ๋Œ€ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ž๋™์œผ๋กœ ๋žœ๋ค ์•ก์„ธ์Šค
์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด ์ค„๊ฒƒ์ด๋‹ค.
์ด๋Ÿฌํ•œ ์ž๋™์„ ํƒ ํ”„๋กœ์„ธ์Šค๋Š” ํŠน์ •ํ•œ ํด๋ž˜์Šค์— ์ ํ•ฉํ•˜๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ๋ณด๋‹ค ์ผ๋ฐ˜ํ™”๋œ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ
์ƒ์† ๋ฐ›์€ ํŠน์ •ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•จ์œผ๋กœ์จ ๊ตฌํ˜„๋œ๋‹ค. ๋”ฐ๋ผ์„œ vector์™€ queue์˜
์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” random_access_iterator๋กœ๋ถ€ํ„ฐ ์ƒ์†์„ ๋ฐ›๊ณ , ๋ฐ˜๋ฉด์— list์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š”
bidirectional_iterator ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋œ๋‹ค.
๊ทธ๋Ÿผ ์ด์ œ ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค์–‘ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ(์ผ€์ด๋ธ”)์˜ ๋๊ณผ ์–ด๋–ป๊ฒŒ ๋งค์น˜๋˜๋Š”์ง€๋ฅผ ์‚ดํŽด๋ณด์ž.
4.2.2 ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์—ฐ๊ฒฐ (Plugging the Cables into th Algorithm)
์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ํ•œ์ชฝ ๋์ด ์–ด๋–ป๊ฒŒ ์ฝ˜ํ…Œ์ด๋„ˆ์™€ ์—ฐ๊ฒฐ๋˜๋Š”์ง€๋ฅผ ์•ž์—์„œ ๋ดค์œผ๋‹ˆ๊นŒ ์ด์ œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜
๋‹ค๋ฅธ ํ•œ์ชฝ์„ ๋ณผ ์ฐจ๋ก€๋‹ค.
์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋ ๊ฒƒ์ธ๊ฐ€?
๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ๋“ค์—๊ฒŒ ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ ํ• ๊ฒƒ์ธ๊ฐ€์— ๋”ฐ๋ผ์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ
ํ•„์š”๋กœ ํ•˜๊ฒŒ ๋œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ์— ๋Œ€ํ•ด ์ž„์˜์˜ ์œ„์น˜์—์„œ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ
ํ•˜๋‹ค๋ฉด ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ๋˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋‹จ์ง€ ์ˆœ์ฐจ์  ์ „๋ฐฉ
์•ก์„ธ์Šค๋งŒ ์›ํ•œ๋‹ค๋ฉด ๋œ ํŒŒ์›Œํ’€ํ•œ forward ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ…Œ์ด๋ธ” 1.9๋Š”
์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ•„์š”๋กœํ•˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
Table 1.9 Type of Iterator Representative Algorithms
=============================================================
Bidirec- Random
Input Output Forward tional Access
=============================================================
for_each x
-------------------------------------------------------------
find x
-------------------------------------------------------------
count x
-------------------------------------------------------------
copy x x
-------------------------------------------------------------
replace x
-------------------------------------------------------------
unique x
-------------------------------------------------------------
reverse x
-------------------------------------------------------------
sort x
-------------------------------------------------------------
nth_element x
-------------------------------------------------------------
merge x x
-------------------------------------------------------------
accumulate x
=============================================================
๋น„๋ก ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด ์–ด๋–ค ํ•œ์ •์  ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ์š”๊ตฌํ•˜๋”๋ผ๊ณ  ์ด๋ณด๋‹ค ๋” ํŒŒ์›Œํ’€ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€
์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. replace() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ forward ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ bidirectional(์–‘๋ฐฉํ–ฅ)
์ด๋‚˜ random access ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
.
์ด์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด, ์ปดํ“จํ„ฐ์— ์žˆ๋Š” ์ผ€์ด๋ธ” ์ฝ”๋„ฅํ„ฐ์ฒ˜๋Ÿผ, ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•€์„ ๊ฐ€์ง„ ์ฝ”๋„ฅํ„ฐ๋ฅผ
๊ฐ€์กŒ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์ž. (๊ทธ๋ฆผ 1.4) ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๊ฒƒ์€ 5๊ฐœ์˜ ํ•€์„ ๊ฐ€์กŒ๊ณ ,
์–‘๋ฐฉํ–ฅ(bidirectional) ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ 4๊ฐœ์˜ ํ•€์ด ์žˆ์œผ๋ฉฐ, ์ „๋ฐฉ(forward) ์ฐธ์กฐ๋ฅผ
์š”ํ•˜๋Š” ๊ฒƒ์€ 3๊ฐœ์˜ ํ•€์ด ์žˆ๋‹ค.
Random_access
container iterator Algorithm
+
----------+ |() -| +
------------+
| vector | ----|() -|----| reverse() |
+
----------+ |() OK -| +
------------+
|() -|
|()
bidirectional
iterator
+
----------+ |() -| +
------------+
| List |----|() -|----| sort() |
+
----------+ |() No -| +
------------+
|() Good -|
-|
[๊ทธ๋ฆผ 1.4 ์ฝ˜ํ…Œ์ด๋„ˆ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ]
์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์—ฐ๊ฒฐ๋  ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๋์€ ๋ช‡ ๊ฐœ์˜ ๊ตฌ๋ฉ์„ ๊ฐ€์ง„ ์ฝ”๋„ฅํ„ฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
5๊ฐœ์˜ ๊ตฌ๋ฉ์„ ๊ฐ€์ง„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” 5๊ฐœ์˜ ํ•€์„ ๊ฐ€์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์—ฐ๊ฒฐ๋˜๊ณ , ๋˜ํ•œ 4๊ฐœ๋‚˜ ๊ทธ ์ดํ•˜์˜
ํ•€์„ ๊ฐ–๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋„ ์—ฐ๊ฒฐ๋  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ 4๊ฐœ์˜ ๊ตฌ๋ฉ์„ ๊ฐ€์ง€๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ
(bidirectional)์™€ 5๊ฐœ์˜ ํ•€์ด ์žˆ๋Š” ๋žœ๋ค ์•ก์„ธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋Š” ์—ฐ๊ฒฐ ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋žœ๋ค
์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” ๋ฒกํ„ฐ์™€ ๋ฐํ๋Š” bidirectional ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ง€๋‹ˆ๊ณ , ์–‘๋ฐฉํ–ฅ
์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ณด๋‹ค ๋œ ํŒŒ์›Œํ’€ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ๋ถ™์„ ์ˆ˜ ์žˆ๋‹ค.
4.3 The Tables Tell the Story
ํ…Œ์ด๋ธ” 1.8๊ณผ 1.9๋กœ๋ถ€ํ„ฐ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ์™€ ์ž‘๋™๋˜๋Š”์ง€๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด, ํ…Œ์ด๋ธ” 1.9๋Š” sort() ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜
์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ…Œ์ด๋ธ” 1.8์„ ๋ณด๋ฉด ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ฒกํ„ฐ์™€ ๋ฐํ๋งŒ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ์„
์•Œ ์ˆ˜ ์žˆ๋‹ค.
ํ…Œ์ด๋ธ”์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด sort()์•Œ๊ณ ๋ฆฌ์ฆ˜์„ list, set, map๋“ฑ์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค.
์ด๋Ÿฌํ•œ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์ด ๋žœ๋ค ์•ก์„ธ์Šค ๋ฐ”๋กœ ๋ฐ‘ ๋‹จ๊ณ„์˜ bidirectional ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—
๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”์—†๋Š” ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋“ ์ง€ ์•„๋ฌด STL ์ฝ˜ํ…Œ์ด๋„ˆ์™€ ์ž‘๋™์ด ๋œ๋‹ค.
(STL์—์„œ singly-linked list๋Š” forward ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ reverse()
์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.)
4.3.1 Overlapping Member Functions and Algorithms (๋ฉค๋ฒ„ํ•จ์ˆ˜์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ค‘์ฒฉ)
๋•Œ๋•Œ๋กœ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์—์„œ ์„ ํƒํ•ด์•ผํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
find()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ๋“  ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ทธ๋ ‡์ง€๋งŒ set๊ณผ map์€ ์ž์‹ ๋งŒ์˜ find() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ณผ์—ฐ ์–ด๋–ค ๋ฒ„์ „์˜ find()๋ฅผ
์‚ฌ์šฉํ• ๊ฒƒ์ธ๊ฐ€? ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉค๋ฒ„ํ•จ์ˆ˜ ๋ฒ„์ „์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ทธ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด
๋น„ ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—” ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
4.4 Iterators at Work
์ง€๊ธˆ๊นŒ์ง€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ๋ณต์žกํ•˜๊ฒŒ ๋– ๋“ค์—ˆ์ง€๋งŒ, ๋ฐฑ๋ฌธ์ด๋ถˆ์—ฌ์ผ๊ฒฌ! ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๋ฉด
์˜์™ธ๋กœ ๊ฐ„๋‹จํ•˜๋‹ค. ์ด๋ฏธ ์•ž์—์„œ ๋ช‡๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์•˜๋“ฏ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ค์€
์ฝ˜ํ…Œ์ด๋„ˆ์˜ begin(), end()๊ฐ€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ฒŒ๋œ๋‹ค. ์—ฌํƒœ๊นŒ์ง€ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์ด
๋ฆฌํ„ดํ•˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ’์ด ํฌ์ธํ„ฐ๋กœ๋งŒ ์ทจ๊ธ‰๋œ๋‹ค๊ณ  ๋งํ•ด์—ˆ์ง€๋งŒ, ์ด์   ์ด๋Ÿฌํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ค์ด
๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์‹คํ•˜๊ฒŒ ์‚ดํŽด๋ณด์ž.
4.4.1 Data Access
๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š”(vector, deque) ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ๋Š” [] ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ
์‰ฝ๊ฒŒ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฐธ์กฐํ–ˆ๋‹ค. ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” list ๊ฐ™์€ ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ์ด๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅธ
๋ฐฉ์‹์˜ ์ฐธ์กฐ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค. ์•ž์—์„œ ๋“ค์—ˆ๋˜ ์˜ˆ ์ค‘์— ์•„์ดํ…œ์„ ํ•˜๋‚˜์”ฉ pop ํ•ด์„œ ๋ฆฌ์ŠคํŠธ์˜
๋‚ด์šฉ์„ displayํ•˜๊ธฐ์œ„ํ•ด "LIST"์™€ "LISTPLUS" ์˜ˆ์ œ์—์„œ destructive readout์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.
์ด๊ฑธ ์ข€๋” ์‹ฌํ™”ํ•˜์—ฌ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ •์˜๋œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.
// listout.cpp
// iterator and for loop for output
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
int arr[] = {2, 4, 6, 8 };
list<int> theList;
for (int k=0; k<4; k+
+) // ๋ฐฐ์—ด์˜ ์—˜๋ฆฌ๋จผํŠธ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฑ„์šด๋‹ค.
theList.push_back(arr[k]);
list<int>::iterator iter; // iterator to list-of-ints
for (iter=theList.begin(); iter != theList.end(); iter+
+)
cout << *iter << ' '; // display the list
cout << endl;
return 0;
}
์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋‹จ์ˆœํžˆ theList ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ณผ๋Š”
2 4 6 8
์ด๋‹ค.
์œ„์—์„œ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ํƒ€์ž…๊ณผ ๋งค์น˜์‹œํ‚ค๊ธฐ์œ„ํ•ด list<int>ํƒ€์ž…์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.
๋งˆ์น˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋“ฏ์ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
for ๋ฃจํ”„์—์„œ iter = theList.begin() ๊ตฌ๋ฌธ์œผ๋กœ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ๋ถ€๋ถ„์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.
++์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ํฌ์ธํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ *์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ’์„ ์—ญ์ฐธ์กฐํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฃจํ”„์˜ ์ข…๋ฃŒ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋์— ๋‹ค๋‹ค๋ž๋‚˜๋ฅผ ์ฒดํฌํ•จ์œผ๋กœ์จ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.
๋˜ํ•œ for ๋ฃจํ”„์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ while ๋ฃจํ”„๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
iter = theList.begin();
while ( iter != theList.end() )
cout << *iter+
+ << ' ';
*iter+
+ ๋ฌธ๋ฒ•์€ ํฌ์ธํ„ฐ์™€ ๊ฐ™๋‹ค.
4.4.2 Data Insertion
์•„๋ž˜์˜ LISTFILL ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ณณ์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š”
๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž.
// listfill.cpp
// uses iterator to fill list with data
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> iList(5); // empty list holds 5 ints
list<int>::iterator it; // iterator
int data = 0;
// fill list with data
for (it=iList.begin(); it != iList.end(); it+
+)
*it = data +
= 2;
// display the list
for (it=iList.begin(); it != iList.end(); it+
+)
cout << *it << ' ';
cout << endl;
return 0;
}
์ฒซ๋ฒˆ์งธ for ๋ฃจํ”„๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— int ๊ฐ’์€ 2, 4, 6, 8, 10์œผ๋กœ ์ฑ„์šด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ for
๋ฃจํ”„๋Š” ์ด ๊ฐ’๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค.
4.4.3 Algorithms and Iterators
์šฐ๋ฆฌ๊ฐ€ ์–˜๊ธฐํ–ˆ๋˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ธ์ž๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋•Œ๋ก  ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ธฐ๋„
ํ•œ๋‹ค. ITERFIND ์˜ˆ์ œ๋Š” find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฆฌ์ŠคํŠธ์— ์ ์šฉ๋˜๋Š” ๊ฑธ ๋ณด์—ฌ์ค€๋‹ค. (์ด๋ฏธ ์•Œ๊ณ ์žˆ๊ฒ ์ง€๋งŒ
find()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์˜ค์ง input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ํ•„์š”ํ•˜๊ธฐ๋•Œ๋ฌธ์— list์™€ ํ•จ๊ป˜ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค.)
// ITERFIND.cpp
// find() returns a list iterator
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
list<int> iList (5); // empty list holds 5 ints
list<int>::iterator it; // iterator
int data = 0;
// fill list with data
for (it=iList.begin(); it != iList.end(); it+
+)
*it = data + 2; // 2, 4, 6, 8, 10
it = find (iList.begin(), iList.end(), 8);
if (it != iList.end())
cout << "nFound 8.n";
else
cout << "nDid not find 8.n";
return 0;
}
find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 3๊ฐœ์˜ ์ธ์ž๋ฅผ ์ทจํ•œ๋‹ค. ์ฒซ๋ฒˆ์งธ์™€ ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ๊ฒ€์ƒ‰๋  ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”
์ดํ„ฐ๋ ˆ์ดํ„ฐ์ด๊ณ , ์„ธ๋ฒˆ์งธ ์ธ์ž๋Š” ์ฐพ์„ ๊ฐ’์ด๋‹ค. find()๊ฐ€ iList.end()๋ฅผ ๋ฆฌํ„ดํ–ˆ๋‹ค๋ฉด ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•˜๊ณ 
๋์— ๋„๋‹ฌํ•œ ๊ฒƒ์ด๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ๊ฐ’์ด ์žˆ๋Š” ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์œ„์˜ ๊ฒฐ๊ณผ๋Š”
์•„๋ž˜์™€ ๊ฐ™๋‹ค.
Found 8.
๊ทธ๋ ‡๋‹ค๋ฉด ๊ฒ€์ƒ‰ํ•œ ๊ฐ’ 8์ด ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๋ช‡๋ฒˆ์งธ ์œ„์น˜์— ์žˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ์ˆ˜ ์žˆ์„๊นŒ? ์•„๋งˆ๋„
์ผ์น˜๋˜๋Š” ์•„์ดํ…œ์˜ offset์—์„œ ์‹œ์ž‘ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋นผ์ฃผ๋ฉด ๋ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ๊ฒƒ์ด๋‹ค.
(it - iList.begin()). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฆฌ์ŠคํŠธ์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ์‚ฌ์šฉ๋œ ์˜ฌ๋ฐ”๋ฅธ ์˜คํผ๋ ˆ์ด์…˜์ด ์•„๋‹ˆ๋‹ค.
๋ฆฌ์ŠคํŠธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋‹จ์ง€ bidirectional ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— ์‚ฐ์ˆ  ์˜คํผ๋ ˆ์ด์…˜์„
์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ณ  ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์ง€์›ํ•˜๋Š” vector๋‚˜ deque์—์„œ๋‚˜ ์‚ฐ์ˆ  ์˜คํผ๋ ˆ์ด์…˜์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ iList๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฒกํ„ฐ v๋ผ๋ฉด ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์จ์„œ ๊ฒ€์ƒ‰ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
it = find (v.begin(), v.end(), 8);
if (it != v.end())
cout << "nFound 8 at location " << (it - v.begin());
else
cout << "nDid not find 8.";
์œ„์˜ ๊ฒฐ๊ณผ๋Š”
Found 8 at location 3
์ด ๋  ๊ฒƒ์ด๋‹ค.
์ธ์ž๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋‹ค๋ฅธ ์˜ˆ์ œ๋ฅผ ๋ณด์ž. vector๋ฅผ copy() ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‹ค๋ฅธ vector๋กœ ๋ณต์‚ฌ
ํ•˜๋Š”๋ฐ ์ธ์ž๋กœ ๋ณต์‚ฌ์›๋ณธ์˜ ๋ฒ”์œ„์™€ ๋ชฉ์  ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์ ์–ด์ค€๋‹ค.
// itercopy.cpp // uses iterators for copy() algorithm
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int beginRange, endRange;
int arr[] = { 11,13,15,17,19,21,23,25,27,29};
vector<int> v1 (arr, arr+
10); // ๋ฒกํ„ฐ ์ดˆ๊ธฐํ™”
vector<int> v2 (10); // ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฒกํ„ฐ
cout << "Enter range to be copied (example: 2 5) ";
cin >> beginRange >> endRange;
vector<int>::iterator iter1 = v1.begin() + beginRange;
vector<int>::iterator iter2 = v1.begin() + endRange;
vector<int>::iterator iter3;
// copy from v1 to v2
iter3 = copy (iter1, iter2, v2.begin());
// iter3์—๋Š” ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ์ด ๋ณต์‚ฌ๋œ๋‹ค.
iter1 = v2.begin();
while (iter1 != iter3)
cout << *iter1++ << ' ';
cout << endl;
return 0;
}
๋ฒ”์œ„๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๊ฒฐ๊ณผ๋Š”
Enter range to be copied (example: 2 5): 3 6
17 19 21
์ด ๋  ๊ฒƒ์ด๋‹ค. v2์˜ ๋ชจ๋“  ์•„์ดํ…œ์„ ๋ณด์—ฌ์ค„ ํ•„์š”์—†์ด ๋ณต์‚ฌ๋œ ๊ฒƒ๋งŒ ๋ณด์—ฌ์ฃผ๋ฉด ๋œ๋‹ค. ๋‹คํ–‰ํžˆ๋„
copy() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ณต์‚ฌ๋  ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋งˆ์ง€๋ง‰ ํฌ์ธํ„ฐ(์ดํ„ฐ๋ ˆ์ดํ„ฐ)๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์€
์ด ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋ณต์‚ฌ๋œ ๊ฐ’๋“ค์„ displayํ•˜๊ฒŒ ํ–ˆ๋‹ค.
4.5 Speialized Iterators
์ด๋ฒˆ ์žฅ์—์„œ๋Š” ํŠน๋ณ„ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ˜•ํƒœ 2๊ฐ€์ง€๋ฅผ ์‚ดํŽด๋ณธ๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” ํฅ๋ฏธ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ
์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ์ž‘๋™์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์–ด๋Žํ„ฐ์™€ ๋งˆ์น˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š”
์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ํ—ˆ์šฉํ•˜๋Š” ์ŠคํŠธ๋ฆผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ค์ด๋‹ค.
4.5.1 Iterator Adapters
STL์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋ณดํ†ต 3๊ฐœ์˜ ๋ณ€์ข…์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฐ๊ฒƒ๋“ค์—๋Š” reverse iterator,
insert iterator, raw storage iterator๊ฐ€ ์žˆ๋‹ค. reverse iterator๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋‚ด์šฉ์„
์—ญ์ˆœ์œผ๋กœ ์ฐธ์กฐํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ณ , insert iterator๋Š” copy()๋‚˜ merge()๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜
๋‚ด์šฉ์„ ๋ณ€๊ฒฝ์‹œํ‚ค๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ณณ์— ๋ฎ์–ด์“ฐ๊ฒŒ ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ
raw storage iterator๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜, raw storage iterator๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ๋‚ด์šฉ์€ ๋‹ค๋ฃจ์ง€ ์•Š์„
๊ฒƒ์ด๋‹ค.
4.5.1.1 Reverse Iterators
์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋์—์„œ ๋ถ€ํ„ฐ ์—ญ์ˆœ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.
์–ธ๋œป ์ƒ๊ฐํ•˜๊ธฐ์— ๋‹ค์Œ์ฒ˜๋Ÿผ ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋‹ค.
list<int>::iterator iter;
iter = iList.end();
while ( ier != iList.begin() )
cout << *iter-- << ' ';
ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์œ„์˜ ์ฝ”๋“œ๋Š” ๋Œ์•„๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ์ด์œ ๋Š” ๋‹จ ํ•œ๊ฐ€์ง€, ๋ฒ”์œ„๊ฐ€ ํ‹€๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
(n-1 ๋ถ€ํ„ฐ 0๊นŒ์ง€ ์—ฌ์•ผ ๋˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ๋Š” n ๋ถ€ํ„ฐ 0๊นŒ์ง€ ๊ฐ€ ๋œ๋‹ค)
์—ญ์ˆœ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ์„๋•Œ๋Š” reverse iterator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ITEREV ํ”„๋กœ๊ทธ๋žจ์€
์—ญ์ˆœ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด reverse iterator๊ฐ€ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
// iterev.cpp // demonstrates reverse iterator
#include <iostream>
#include <list>
using namespace std;
int main()
{
int arr[] = {2, 4, 6, 8, 10};
list <int> theList;
for (int j=0; j<5; j+
+)
theList.push_back( arr[j] );
list< int>::reverse_iterator revit;
revit = theList.rbegin();
while (revit != theList.rend() )
cout << *revit++ << ' ';
cout << endl;
return 0;
}
์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š”
10 8 6 4 2
๊ฐ€ ๋œ๋‹ค. reverse iterator๋ฅผ ์‚ฌ์šฉํ• ๋•Œ rbegin()๊ณผ rend()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์ด๊ฑธ๋กœ ์ •์ƒ์ 
์ˆœ์„œ๋กœ๋œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ์ ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. -_-;) ๋‹นํ™ฉ์Šค๋Ÿฝ๊ฒ ์ง€๋งŒ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ
์œ„ํ•ด ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” rbegin()์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ  ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ --ํ•˜์ง€ ๋ง๊ณ  +
+ํ•ด์•ผ ํ•œ๋‹ค.
reverse iterator๋Š” ํ•ญ์ƒ rbegin()์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  rend()๋กœ ๋๋‚˜๊ณ , ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ฆ๊ฐ€ ์‹œ์ผœ์•ผํ•œ๋‹ค.
4.5.1.2 Insert Iterators
copy() ๊ฐ™์€ ์ผ๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์กด์žฌํ•˜๋Š” ๋‚ด์šฉ์œ„์— ๋ฎ์–ด์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. COPYDEQ ํ”„๋กœ๊ทธ๋žจ์€
๋‹ค๋ฅธ ๋ฐํ๋กœ ๋ณต์‚ฌํ•˜๋Š” ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
// copydeq.cpp // demonstrates normal copy with deques
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
int arr1[] = {1, 3, 5, 7, 9};
int arr2[] = {2, 4, 6, 8, 10};
deque <int> d1;
deque <int> d2;
for (int j=0; j<5; j+
+) {
d1.push_back( arr1[j] );
d2.push_back( arr2[j] );
}
// d1 ์„ d2๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
copy(d1.begin(), d1.end(), d2.begin());
for (int k=0; k<d2.size(); k+
+)
cout << d2[k] << ' ';
cout << endl;
return 0;
}
์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” 1 3 5 7 9 ๊ฐ€ ๋œ๋‹ค.
d2๋ฅผ ๋“ค์—ฌ๋‹ค ๋ณด๋ฉด d2๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋‚ด์šฉ๋“ค์ด d1์˜ ๊ฒป๋“ค๋กœ ๋ฎ์–ด ์“ฐ์—ฌ์ง„ ๊ฒƒ์ด๋‹ค.
์ด๋Ÿฐ ๋™์ž‘์€ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” copy() ๋ณด๋‹ค๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ
์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„๋•Œ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋•Œ๋Š” insert ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ด๊ฒƒ์˜ ์„ธ๊ฐ€์ง€
๋ณ€์ข…์„ ๋ณด์ž
โ— back_inserter: ๋’ค์—๋‹ค new ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋„ฃ๋Š”๋‹ค.
โ— front_inserter: ์•ž์—๋‹ค new ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋„ฃ๋Š”๋‹ค.
โ— inserter : new ์•„์ดํ…œ์„ ์›ํ•˜๋Š” ์œ„์น˜์— ๋„ฃ๋Š”๋‹ค.
DINSITER ํ”„๋กœ๊ทธ๋žจ์€ back_inserter ์˜ ์‚ฌ์šฉ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
// dinsiter.cpp // demonstrates insert iterators with queues
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
int arr1[] = {1, 3, 5, 7, 9};
int arr2[] = {2, 4, 6,};
deque <int> d1; deque <int> d2;
for (int i=0; i<5; i+
+)
d1.push_back( arr1[i] );
for (int j=0; j<3; j+
+)
d2.push_back( arr2[j] );
// d1์„ d2๋กœ ๋ณต์‚ฌํ•˜๋Š”๋ฐ ์ˆœ์„œ๋Š” ์—ญ์ˆœ์ด๋œ๋‹ค.
copy (d1.begin(), d1.end(), back_inserter(d2));
cout << "nd2: ";
for (int k=0; k<d2.size(); k+
+)
cout << d2[k] << ' ';
cout << endl;
return 0;
}
ํƒ€๊ฒŸ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋’ค์—๋‹ค๊ฐ€ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด back_iterator๋Š” push_back() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ณ 
์†Œ์Šค ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋‚ด์šฉ์€ ๋ณ€ํ•จ์ด ์—†๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” ์›๋ž˜ d2์˜ ๋‚ด์šฉ์— d1์˜ ๋‚ด์šฉ์ด
์ถ”๊ฐ€๋œ
2 4 6 1 3 5 7 9
๊ฐ€ ๋œ๋‹ค.
๋งŒ์ผ front_inserter ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด
copy (d1.begin(), d1.end(), front_inserter (d2));
push_front() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์•ž์—์„œ๋ถ€ํ„ฐ ์‚ฝ์ž…ํ•ด๋‚˜๊ฐ„๋‹ค.
๊ฒฐ๊ณผ: 9 7 5 3 1 2 4 6
๋˜ํ•œ ์ž„์˜์˜ ์œ„์น˜์— new ์•„์ดํ…œ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜๋Š” d2์˜ ์ฒ˜์Œ์— d1์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
copy (d1.begin(), d1.end(), inserter(d2, d2.begin()));
๊ฒฐ๊ณผ: 1 3 5 7 9 2 4 6
์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ inserter์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” vector์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ด์œ ๋Š” vector์—๋Š” push_front() ๋ฉ”์˜๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐฑํ„ฐ๋Š” ๋ฌด์กฐ๊ฑด ๋์—์„œ๋ถ€ํ„ฐ
์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
4.5.1.3 Stream Iterators
์ŠคํŠธ๋ฆผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ํ™”์ผ๊ณผ I/O ๋””๋ฐ”์ด์Šค(cin์ด๋‚˜ cout)๋ฅผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ๋‹ค๋ฃฐ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต
ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ธ์ž๋กœ ํŒŒ์ผ๊ณผ IO ๋””๋ฐ”์ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
input๊ณผ output์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ์ฃผ๋ชฉ์ ์ด ์ด๋Ÿฌํ•œ ์ŠคํŠธ๋ฆผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜๋Š”๊ฒƒ์ด๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ง์ ‘ input๊ณผ output์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ์‚ฌ์‹ค ์ŠคํŠธ๋ฆผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š”
์„œ๋กœ ๋‹ค๋ฅธ input์ด๋‚˜ output์„ ํ…œํ”Œ๋ฆฟํ™”ํ•œ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘๊ฐ€์ง€์˜ ์ŠคํŠธ๋ฆผ์ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ
ostream_iterator์™€ istream_iterator์ด๋‹ค.
4.5.1.3.1 The ostream_iterator Class
ostream_iterator ์˜ค๋ธŒ์ ํŠธ๋Š” ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ์ธ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
// outiter.cpp
// demonstrates ostream_iterator
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int main()
{
int arr [] = { 10, 20, 30, 40, 50 };
list <int> theList;
for (int j=0; j<5; j+
+)
theList.push_back (arr[j]);
ostream_iterator<int> ositer(cout, ","); // ostream iterator
cout << "nContents of list: ";
copy (theList.begin(), theList.end(), ositer); // display list
cout << endl;
return 0;
}
์—ฌ๊ธฐ์„œ๋Š” int ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด ostream iterator๋ฅผ ์ •์˜ํ–ˆ๋‹ค. ์ƒ์„ฑ์ž์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š”
int ๊ฐ’์ด ์”Œ์–ด์งˆ stream value์ด๊ณ , ๋‘๋ฒˆ์งธ ์ธ์ž ๋ฌธ์ž์—ด์€ ๊ฐ ๊ฐ’๋งˆ๋‹ค ๋ซ๋ถ™๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ stream value๋Š” ํ™”์ผ๋ช…์ด๋‚˜ cout์ด๋ฉด ๋œ๋‹ค.
copy() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฆฌ์ŠคํŠธ์˜ ๋‚ด์šฉ์„ cout์œผ๋กœ ๋ณต์‚ฌํ•˜๊ฒŒ๋œ๋‹ค. copy()์˜ ์„ธ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ๋ฐ”๋กœ
ostream iterator๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
์œ„์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
Contents of list: 10, 20, 30, 40, 50,
๋‹ค์Œ ์˜ˆ์ œ FOUTITER๋Š” ostream iterator๋กœ ํ™”์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค.
// outiter.cpp
// demonstrates ostream_iterator with files
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int main()
{
int arr [] = { 11, 21, 31, 41, 51 };
list <int> theList;
for (int j=0; j<5; j+
+)
theList.push_back (arr[j]);
ofstream outfile ("ITER.DAT"); // create file object
ostream_iterator<int> ositer(outfile, " "); // ostream iterator
cout << "nContents of list: ";
copy (theList.begin(), theList.end(), ositer); // display list
return 0;
}
ํ™”์ผ๊ณผ ์—ฐ๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ofstream์„ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ณ 
๋ฉ”๋ชจ์žฅ์œผ๋กœ ITER.DAT๋ฅผ ์—ด์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
11 21 31 41 51
4.5.1.3.2 The istream_iterator Class
istream_iterator ์˜ค๋ธŒ์ ํŠธ๋Š” input iterator๋ฅผ ๊ฐ€์ง„ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋“ ์ง€ ์ธ์ž๋กœ ์‚ฌ์šฉ
ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ INITER๋Š” ์ด๋Ÿฌํ•œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ copy() ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฒ˜์Œ 2๊ฐœ์˜ ์ธ์ž๋กœ ์‚ฌ์šฉ
๋˜๋Š” ๊ฑธ ๋ณด์—ฌ์ค€๋‹ค.
// initer.cpp
// demonstrates istream_iterator
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
list<float> fList (5); // uninitialized list
cout << "nEnter 5 floating-point numbers: ";
istream_iterator <float> cin_iter(cin); // cin
istream_iterator <float> end_of_stream; // eos
//K:์ด๊ณณ์—์„œ cin_iter์— ๊ฐ’์„๋„ฃ๊ณ  ํ•˜๋‚˜์”ฉ EOS๊ฐ€ ๋ ๋•Œ๊นŒ์ง€ fList๋กœ ๊ณ„์† ๋ณต์‚ฌํ•œ๋‹ค.
copy ( cin_iter, end_of_stream, fList.begin() );
cout << endl;
ostream_iterator<float> ositer(cout, "--");
copy (fList.begin(), fList.end(), ositer);
cout << endl;
return 0;
}
์œ„ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š”
Enter 5 floating-point numbers: 1.1 2.2 3.3 4.4 5.5
1.1--2.2--3.3--4.4--5.5--
copy()์—์„œ ์ฃผ๋ชฉํ•  ์‚ฌํ•ญ์€, ๋ฐ์ดํ„ฐ๋ฅผ cin์—์„œ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋  ๋ฒ”์œ„์˜ ๋(end_of_stream)์„ ๋ช…์‹œ
ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. istream_iterator๋Š” cin_iter๋ผ๊ณ  ์„ ์–ธ๋œ cinํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด
end_of_stream์€ ๋ฌด์—‡์ธ๊ฐ€? ์ธ์ž๊ฐ€ ์—†์ด ์ƒ์„ฑ๋œ end_of_stream์€ ์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ ํŠน๋ณ„ํ•œ
์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค. ์ด๊ฒƒ์€ ํ•ญ์ƒ ์ŠคํŠธ๋ฆผ์˜ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” istream_iterator๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
user๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด์„œ ์–ด๋–ป๊ฒŒ end-of-stream์ž„์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ
<ctrl><z>๋ฅผ ๋ˆŒ๋Ÿฌ ์ž…๋ ฅ์„ ์ข…๋ฃŒ์‹œํ‚ค๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„์—์„ , ๋ฌผ๋ก  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ๋งŽ๊ฒ ์ง€๋งŒ,
๋ฆฌ์ŠคํŠธ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ostream_iterator๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
๋‹ค์Œ ์˜ˆ์ œ FINITER๋Š” copy()์˜ ์ž…๋ ฅ์œผ๋กœ cin๋Œ€์‹  file์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋‹ค.
// finiter.cpp // demonstrates istream_iterator with files
#include <iostream> #include <list>
#include <fstream> #include <algorithm>
using namespace std;
int main()
{
list<int> iList(5);
ifstream infile ("ITER.DAT"); // create input file object
// (ITER.DAT๋Š” ๋ฏธ๋ฆฌ ์ค€๋น„๋ฅผ ํ•ด์•ผ๊ฒ ์ฃ )
istream_iterator<int> file_iter(infile); // file
istream_iterator<int> end_of_stream; // eos
copy ( file_iter, end_of_stream, iList.begin() );
cout << endl;
// dispaly iList
ostream_iterator<int> ositer(cout, "--");
copy (iList.begin(), iList.end(), ositer);
cout << endl;
return 0;
}
FINITER์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
11--21--31--41--51โ€”
์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ™”์ผ๋กœ์จ ITER.DAT๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ifstream์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์œ„์—์„œ cout๋Œ€์‹ ์—
ofstream์„ ์ด์šฉํ•˜์—ฌ outfile๋กœ ๋Œ€์น˜ํ•ด์ฃผ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ํ™”์ผ๋กœ๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋˜๋‹ค๋ฅธ ์‘์šฉ์œผ๋กœ์จ iList์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ์œ„ํ•ด back_inserter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฐฉ๋ฒ•์€ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ iList๋งŒ๋“ค๊ณ  ์ถ”๊ฐ€ํ•ด ๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.
5 Associative Containers
์ด์ œ๊นŒ์ง€ ๊ณ ์ •๋œ ์„ ํ˜• sequence์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” sequence ์ฝ˜ํ…Œ์ด๋„ˆ(vector, list, deque)
๋ฅผ ๋‹ค๋ฃจ์—ˆ์—ˆ๋‹ค. ์œ ์šฉํ•œ ๊ฒƒ๋“ค์ด์ง€๋งŒ, item์„ ์ฐพ๊ธฐ์œ„ํ•ด์„œ๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๋ชจ๋“  item๋“ค์„
ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•ด ๋‚˜๊ฐ์œผ๋กœ์จ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
๋ฐ˜๋ฉด์— associative ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ๋Š” item์ด ์ผ๋ จ์˜ ์—ฐ์†์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค. ์ข€๋” ๋ณต์žกํ•œ
์ •๋ ฌ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ฐพ๊ณ ์ž ํ•˜๋Š” item์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฐ์—ด๋ฒ•์€
hash table์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ์ ‘๊ทผ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ tree๊ตฌ์กฐ๋ฅผ ๋ˆ๋‹ค.
๋”ฐ๋ผ์„œ assoiative ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๊ฒ€์ƒ‰ ์†๋„์ด๋‹ค.
๊ฒ€์ƒ‰์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด๊ฐ™์€ single value๋กœ ํ‘œํ˜„๋˜๋Š” key๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
์ด ํ‚ค๊ฐ’์€ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ object์˜ ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๊ฑฐ๋‚˜, ์ „์ฒด object๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ๋„ ํ•œ๋‹ค.
STL์—์„œ associative ์ฝ˜ํ…Œ์ด๋„ˆ์˜ 2๊ฐ€์ง€ ์ฃผ์š” ๋ถ„๋ฅ˜๋กœ set๊ณผ map์ด ์žˆ๋‹ค.
set์€ key๋ฅผ ํฌํ•จํ•œ object๋ฅผ ์ €์žฅํ•œ๋‹ค. map์€ ๋‘๋ถ€๋ถ„์œผ๋กœ(pair) ๋‚˜๋ˆ„์–ด ์ €์žฅํ•˜๋Š”๋ฐ,
์ฒซ๋ฒˆ์งธ ๋ถ€๋ถ„์€ key๋ฅผ ํฌํ•จํ•œ object์ด๊ณ  ๋‘๋ฒˆ์งธ ๋ถ€๋ถ„์€ value๋ฅผ ํฌํ•จํ•˜๋Š” object์ด๋‹ค.
set๊ณผ map์€ ๋ชจ๋‘, ๊ฐ ํ‚ค์— ๋Œ€ํ•ด์„œ ์˜ค์ง ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์ „์—์„œ
๊ฐ ๋‹จ์–ด์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์ด์ƒ์˜ ์—”ํŠธ๋ฆฌ๋ฅผ ๊ฐ–์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ STL์€ ๋‘๊ฐ€์ง€ ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ์œ„์˜ ์ œ์•ฝ์‚ฌํ•ญ์ด ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.
multiset, multimap์€ set, map๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฐ™์€ ํ‚ค์—๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋‹ค.
associtave ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค๊ณผ ๋งŽ์€ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋“ค์„ ๊ณต์œ ํ•˜์ง€๋งŒ,
lower_bound()๋‚˜ equal_range() ๊ฐ™์€ ๋ช‡๋ช‡ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ associative ์ฝ˜ํ…Œ์ด๋„ˆ์—๋งŒ ์žˆ๋‹ค.
5.1 Sets and Multisets
set์€ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ employees๊ฐ™์€ ์‚ฌ์šฉ์ž์ •์˜ ํด๋ž˜์Šค๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
๋˜ํ•œ set์€ string๊ฐ™์€ ๋‹จ์ˆœ object๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ๋„ ์‚ฌ์šฉ๋œ๋‹ค.
๊ทธ๋ฆผ 5.5๋Š” set์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ชจ์–‘์ƒˆ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. object๋Š” ์ˆœ์„œ๋ฐ๋กœ ์ •๋ ฌ๋˜์–ด์ง€๊ณ ,
๋ชจ๋‘ key๋ฅผ ๊ฐ€์ง„๋‹ค.
set
"puma" โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ โ”‚ "cat" โ”‚ โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ โ”‚ "dog" โ”‚ โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ โ”‚ "ocelot" โ”‚ โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ””โ”€โ”€โ”€โ”€โ”ผโ”€โ–ถ โ”‚ "puma" โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ "raindeer" โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ–ฒ โ”‚
โ””โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚
โ””โ”€ keys
[๊ทธ๋ฆผ 5.5] A Set of string objects.
// set.cpp
// set stores string objects
#include <iostream>
#include <set>
#pragma warning (disable: 4786) // for set (microsoft compilers only)
#include <string>
using namespace std;
int main()
{
string names [] = { "Juanita", "Robert", "Marry", "Amanda", "Marie" };
set <string, less<string> > nameSet (names, names+
5);
set <string, less<string> >::iterator iter;
nameSet.insert ("Yvette"); // insert more names
nameSet.insert ("Larry");
nameSet.insert ("Robert"); // no effect; already in set
nameSet.insert ("Barry");
nameSet.erase ("Marry"); // erase a name
cout << "nSize=" << nameSet.size() << endl;
iter = nameSet.begin();
while (iter != nameSet.end())
cout << *iter+
+ << 'n';
string searchName;
cout << "Enter name to search for: ";
cin >> searchName;
iter = nameSet.find (searchName);
if ( iter == nameSet.end() )
cout << "The name " << searchName << " is NOT in the set.";
else
cout << "The name " << *iter << " IS in the set.";
cout << endl;
return 0;
}
set์„ ์„ ์–ธํ•  ๋•Œ, ์ €์žฅ๋  object(string)์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ  ๋ฉค๋ฒ„๋ฅผ ์ •๋ ฌํ•˜๊ธฐ์œ„ํ•ด
function object์ธ less<> ()๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๋ณด์•„์˜จ
STL์˜ ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค๊ณผ ์œ ์‚ฌํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. array๋ฅผ ์ด์šฉํ•ด์„œ set์„ ์ดˆ๊ธฐํ™” ํ•˜๊ณ 
insert() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐ˜๋ณต์ž(iterator)๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅ์„ ํ•œ๋‹ค.
set์—์„œ ํŠน์ •ํ•œ ๊ฐ’์„ ์ฐพ๊ธฐ์œ„ํ•ด์„œ๋Š” find() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (sequential ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ๋Š”
find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.)
๋‹ค์Œ์€ ์œ„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๊ณ  "George"๋ž€ ์ด๋ฆ„์„ ์ž…๋ ฅํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.
Size=7
Amanda
Barry
Juanita
Larry
Marie
Robert
Yvette
Enter name to search for: George
The name George is NOT in set.
๊ทธ๋Ÿผ ์ด์ œ associative ์ฝ˜ํ…Œ์ด๋„ˆ์—๋งŒ ์žˆ๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.
๋‹ค์Œ์˜ ์˜ˆ์ œ๋Š” ์•ž์—์„œ ๋งํ•œ ์˜ˆ์ œ๋Š” lower_bound()์™€ upper_bound()์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค.
// setrange.cpp
// tests ranges within a set
#include <iostream>
#include <set>
#pragma warning (disable: 4786) // for set (microsoft compilers only)
#include <string>
using namespace std;
int main()
{
set <string, less<string> > organic;
set <string, less<string> >::iterator iter;
organic.insert ("Curine"); // insert organic compounds
organic.insert ("Xanthine"); organic.insert ("Curarine");
organic.insert ("Melamine"); organic.insert ("Cyanimide");
organic.insert ("Phenol"); organic.insert ("Aphrodine");
organic.insert ("Imidazole"); organic.insert ("Cinchonie");
organic.insert ("Palmitamide");
iter = organic.begin();
while ( iter != organic.end() )
cout << *iter+
+ << 'n';
string lower, upper;
cout << "nEnter range (example C Czz): ";
cin >> lower >> upper;
iter = organic.lower_bound (lower);
while ( iter != organic.upper_bound (upper) )
cout << *iter+
+ << 'n';
return 0;
}
์ด ํ”„๋กœ๊ทธ๋žจ์€ ์ฒ˜์Œ์— ์กฐ์ง ๊ตฌ์„ฑ์›์„ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กฌํ”„ํŠธ์ƒ์—์„œ ์ž…๋ ฅ๋ฐ›์€
๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ถœ๋ ฅํ•œ๋‹ค.
Aphrodine
Cinchonie
Curarine
Curine
Cyanimide
Imidazole
Melamine
Palmitamide
Phenol
Xanthine
Enter range (example C Czz): Aaa Curb
Aphrodine
Cinchonine
Curarine
lower_bound() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ํ‚ค๊ฐ’์„ ๋ฐ›๊ณ  ํ‚ค๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๊ฐ€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๋Š”
์ฒ˜์Œ ์—”ํŠธ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” iterator๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
upper_bound() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์—ญ์‹œ ์ธ์ž๋กœ ํ‚ค๊ฐ’์„ ๋ฐ›๊ณ  ํ‚ค๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„
๊ฐ–๋Š” ์ฒ˜์Œ ์—”ํŠธ๋ฆฌ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
5.2 Maps and Multimaps
map์€ key ์˜ค๋ธŒ์ ํŠธ์™€ value์˜ค๋ธŒ์ ํŠธ์˜ ์Œ(pair)์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒƒ์„ ์ €์žฅํ•œ๋‹ค.
key ์˜ค๋ธŒ์ ํŠธ๋Š” ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋  key๋ฅผ ํฌํ•จํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๊ณ , value ์˜ค๋ธŒ์ ํŠธ๋Š”
์ฒจ๋ถ€๋œ ๋ฐ์ดํ„ฐ์ด๋‹ค. key ์˜ค๋ธŒ์ ํŠธ๋Š” set์—์„œ ์ฒ˜๋Ÿผ strings, numbers, ๊ทธ๋ฆฌ๊ณ 
์ข€๋” ๋ณต์žกํ•œ ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. value๋Š” ์ฃผ๋กœ strings ๋‚˜ numbers๊ฐ€
๋˜์ง€๋งŒ ์ด๊ฒƒ ๋˜ํ•œ ๋ณต์žกํ•œ ํด๋ž˜์Šค์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด, ์–ด๋–ค ๋ฌธ์„œ๊ฐ€ ์žˆ์„๋•Œ, key๊ฐ€ word์ด๊ณ  value๋Š” ๋ฌธ์„œ์—์„œ ์ด ๋‹จ์–ด๊ฐ€ ์“ฐ์ธ
ํšŸ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ map์€ ์ฃผ๋กœ ๋นˆ๋„ํ…Œ์ด๋ธ”(frequency table)์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ
์‚ฌ์šฉ๋œ๋‹ค. ๋˜๋Š” key๋ฅผ ๋‹จ์–ด(word)๋กœ ํ•˜๊ณ  value๋ฅผ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ๋ฆฌ์ŠคํŠธ๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
๊ทธ๋ฆผ 5.6์€ ์‚ฌ์ „์ฒ˜๋Ÿผ key๊ฐ€ ๋‹จ์–ด์ด๊ณ  value๊ฐ€ ์„ค๋ช…์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์„ ๋„์‹ํ™” ํ•œ๊ฒƒ์ด๋‹ค.
"snail" โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ โ”‚ "cat" โ”œ "A small, furry animal โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ that chases mice." โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ โ”‚ "dog" โ”œ "A largre, hairy animal โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ that chases sticks." โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ””โ”€โ”€โ”€โ”€โ”ผโ”€โ–ถ โ”‚ "snail" โ”œ "A small, shelled animal โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ that eats gardends." โ”‚
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ "puma" โ”œ "A large, furry animal โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ that eats hikers." โ”‚
โ”‚ โ–ฒ โ”‚
โ””โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚
โ””โ”€ key-value pairs
[๊ทธ๋ฆผ 5.6] A map of word-phrase pairs.
map์€ Associative Array๋กœ์จ ์‚ฌ์šฉ๋œ๋‹ค. C+
+ ๋ฐฐ์—ด์—์„œ ํŠน์ • ๊ฐ’์„ ์ฐธ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š”
๋ฐฐ์—ด ์ธ๋ฑ์Šค๋Š” integer์ด๋‹ค. ์ฆ‰ anArray[3] ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋œ๋‹ค. Associative Array์€
๋ฐฐ์—ด ์ธ๋ฑ์Šค ํƒ€์ž…์„ ๋ง˜๋ฐ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด ์ด๋‹ค. ๋งŒ์•ฝ ์ธ๋ฑ์Šค ํƒ€์ž…์„ string์œผ๋กœ
ํ–ˆ๋‹ค๋ฉด anArray ["jane"]์™€ ๊ฐ™์€ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
5.2.1 An Associative Array
์ด์ œ map์˜ ์˜ˆ์ œ๋กœ Associative Array๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ๋ณด์ž. key๋Š” ์–ด๋–ค ๋„์‹œ์˜ ์ด๋ฆ„์ด ๋˜๊ณ 
value๋Š” ์ด ๋„์‹œ์˜ ์ธ๊ตฌ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
// asso_arr
// demonstrates map used as associative array
#include <iostream>
#include <string>
#include <map>
#pragam warning (disable: 4786) // for map (Microsoft only)
using namespace std;
int main ()
{
string name;
int pop;
string states [] = { "Wyoming", "Colorado", "Nevada",
"Montana", "Arizona", "Idaho" };
int pops [] = {470, 2890, 800, 787, 2781, 944 };
map <string, int, less<string> > mapStates;
map <string, int, less<string> >::iterator iter;
for (int j=0; j<6; j+
+) {
name = states[j];
pop = pops[j];
mapStates[name] = pop; // map์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
}
cout << "Enter state: ";
cin >> name;
pop = mapStates[name]; // ์ธ๊ตฌ์ž๋ฃŒ๋ฅผ ์ฐพ๋Š”๋‹ค.
cout << "Population: " << pop << ",000n";
cout << endl;
for (iter = mapStates.begin(); iter != mapStates.end(); iter+
+)
cout << (*iter).first << ' ' << (*iter).second << ",000n";
return 0;
}
ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๊ณ , ๋„์‹œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ map์—์„œ ์ž…๋ ฅํ•œ ๋„์‹œ๋ฅผ
ํ‚ค๋กœ ํ•ด์„œ ์ธ๊ตฌ๋ฅผ ์ฐพ์•„ ๋‹ค์‹œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ฃผ๊ณ  ์ „์ฒด ์ž๋ฃŒ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
Enter state: Wyoming
Population: 470,000
Arizona 2718,000
Colorado 2890,000
Idaho 944,000
Montana 787,000
Nevada 800,000
Wyoming 470,000
set์ด๋‚˜ map์˜ ๊ฒ€์ƒ‰ ์†๋„๋Š” ๋›ฐ์–ด๋‚˜๋‹ค. ์ด ์˜ˆ์ œ๋กœ ์†๋„๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€๋งŒ
์ˆ˜๋ฐฑ๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์‹œํ—˜ํ•ด๋ณด๋ฉด ๊ธˆ๋ฐฉ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
์œ„์˜ ์˜ˆ์ œ์—์„œ ์ฃผ๋ชฉํ•  ๊ฒƒ์€ map์„ ์„ ์–ธํ• ๋•Œ ์„ธ๋ฒˆ์งธ๋กœ ๋“ค์–ด๊ฐ„ ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ค.
map <string, int, less<string> > mapStates;
^^^^
์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” key ์˜ค๋ธŒ์ ํŠธ์˜ ํƒ€์ž…์ด๊ณ , ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” value ์˜ค๋ธŒ์ ํŠธ์˜ ํƒ€์ž…์ด๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ์„ธ๋ฒˆ์งธ ์ธ์ž๋Š” ํ‚ค๊ฐ€ ์ €์žฅ๋ ๋•Œ์˜ ์ •๋ ฌ๋ฐฉ์‹์„ ์ง€์ •ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ•œ๊ฐ€์ง€ ๋” ์ฃผ์˜ํ•  ๊ฒƒ์€ map์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.
mapStates[name] = pop;
์œ„ ํ‘œํ˜„์€ C+
+ ๋ฐฐ์—ด ํ‘œํ˜„์ฒ˜๋Ÿผ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ
์ธ๋ฑ์Šค ํƒ€์ž…์€ string์ด๊ณ  ๋ฐฐ์—ดํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.
๋ฐ˜๋Œ€๋กœ ๊ฐ’์„ ์ฐธ์กฐํ• ๋•Œ๋Š” ์•„๋ž˜ ์ฒ˜๋Ÿผ ํ•œ๋‹ค.
pop = mapStates[name];
๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต์ž(iterator)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” (*iter).first๊ฐ€ key์˜ค๋ธŒ์ ํŠธ์ด๊ณ 
(*iter).second๊ฐ€ value ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.
6. Storing User-Defined Objects
์ด์ œ๊นŒ์ง€ ์–ธ๊ธ‰๋œ ์˜ˆ์ œ๋“ค์€ ๊ธฐ๋ณธํƒ€์ž…์œผ๋กœ ์กด์žฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋งŒ ๋‹ค๋ฃจ์—ˆ์ง€๋งŒ STL์€
์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ ํด๋ž˜์Šค๋กœ๋„ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜
์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ์–ด๋ณธ๋‹ค.
6.1 A Set of person Objects
์ด๋ฆ„, ์„ฑ, ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๋Š” person ํด๋ž˜์Šค๋กœ ์‹œ์ž‘ํ•ด๋ณด์ž. ์ด ํด๋ž˜์Šค๋ฅผ set์— ์ €์žฅ์‹œ์ผœ
์ „ํ™”๋ฒˆํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ฒƒ์ด๋‹ค.
// setpers.cpp
// uses a multiset to hold person objects
#include <iostream>
#include <set>
#pragma warning (disable:4786) // for set (Microsoft only)
#include <string>
using namespace std;
class person
{
private:
string lastName;
string firstName;
long phoneNumber;
public:
person () : lastName ("blank"), firstName ("blank"), phoneNumber (0)
{ }
person (string lana, string fina, long pho) :
lastName(lana), firstName (fina), phoneNumber (pho)
{ }
friend bool operator< (const person&, const person&);
friend bool operator== (const person&, const person&);
void display () const { // display person's data
cout << endl << lastName << ",t" << firstName
<< "ttphone: " << phoneNumber;
}
};
bool operator < (const person& p1, const person& p2)
{
if (p1.lastName == p2.lastName)
return (p1.firstName < p2.firstName) ? true : false;
return (p1.lastName < p2.lastName) ? true : false;
}
bool operator== (const person& p1, const person& p2)
{
if (p1.lastName == p2.lastName && p1.firstName == p2.firstName)
return true;
else
return false;
}
//////////////////////////////////////////////////////////////////////////
int main ()
{
// person ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
person pers1 ("Deauville", "William", 8435150);
person pers2 ("McDonald", "Stacey", 3327536);
person pers3 ("Bartoski", "Peter", 6946473);
person pers4 ("KuangThu", "Bruce", 4157300);
person pers5 ("Wellington", "Jhon", 9207400);
person pers6 ("McDonald", "Amanda", 8435150);
person pers7 ("Fredericks", "Roger", 7049982);
person pers8 ("McDonald", "Stacey", 7764987);
multiset < person, less<person> > persSet; // person๋“ค์˜ multiset
multiset < person, less<person> >::iterator iter; // iterator
// multiset์— person ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
persSet.insert (pers1); persSet.insert (pers2);
persSet.insert (pers3); persSet.insert (pers4);
persSet.insert (pers5); persSet.insert (pers6);
persSet.insert (pers7); persSet.insert (pers8);
cout << "nNumber of entries = " << persSet.size();
// multiset์˜ content๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
iter = persSet.begin();
while (iter != persSet.end())
(*iter+
+).display();
// lastName๊ณผ firstName์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
string searchLastName, searchFirstName;
cout << "nnEnter last name of person to search for: ";
cin >> searchLastName;
cout << "Enter first name: ";
cin >> searchFirstName;
// ์ž…๋ ฅ๋ฐ›์€ ์ด๋ฆ„์œผ๋กœ searchPerson ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
person searchPerson (searchLastName, searchFirstName, 0);
// ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด ๋ช‡๋ช…์ธ๊ฐ€ ์„ธ์–ด๋ณธ๋‹ค.
int cntPersons = persSet.count (searchPerson);
cout << "Number of persons with this name = " << cntPersons;
// ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•œ๋‹ค.
iter = persSet.lower_bound (searchPerson);
while ( iter != persSet.upper_bound (searchPerson) )
(*iter+
+).display ();
cout << endl;
return 0;
}
person ํด๋ž˜์Šค๊ฐ€ STL ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ ์ž‘๋™๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡๊ฐ€์ง€ ๊ณตํ†ต์œผ๋กœ ์“ฐ์ด๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜๊ฐ€
ํ•„์š”ํ•˜๋‹ค. ๋ฐ”๋กœ ๊ธฐ๋ณธ์ƒ์„ฑ์ž, < ์˜คํผ๋ ˆ์ดํ„ฐ, == ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๋ฉค๋ฒ„ํ•จ์ˆ˜๋“ค์€
๋ฆฌ์ŠคํŠธ ํด๋ž˜์Šค์™€ ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค. ๋˜ํ•œ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด
ํ•„์š”ํ•œ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜คํผ๋ ˆ์ดํ„ฐ < ์™€ == ๋Š” const ์ธ์ž์ด์–ด์•ผ ํ•˜๊ณ 
friend๋กœ ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค (๋ฉค๋ฒ„ํ•จ์ˆ˜๋กœ ํ•ด๋„ ์ƒ๊ด€์€ ์—†๋‹ค).
์˜ค๋ฒ„๋กœ๋“œ๋œ < ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” set์— ์ €์žฅ๋ ๋•Œ ์ •๋ ฌ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์˜ˆ์ œ setpers์—์„œ๋Š”
last name์„ ์ •๋ ฌํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ๊ณ , last name์ด ๋™์ผํ•˜๋ฉด first name์œผ๋กœ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ฒŒ
๋งŒ๋“ค์—ˆ๋‹ค. ์œ„ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
Number of entries = 8
Bartoski, Peter phone: 6946473
Deauville, William phone: 8435150
Fredericks, Roger phone: 7049982
KuangThu, Bruce phone: 4157300
McDonald, Amanda phone: 8435150
McDonald, Stacey phone: 3327536
McDonald, Stacey phone: 7764987
Wellington, Jhon phone: 9207400
Enter last name of person to search for: McDonald
Enter first name: Stacey
Number of persons with name = 2
McDonald, Stacey phone: 3327536
McDonald, Stacey phone: 7764987
(K:VC++6.0์—์„œ ์œ„์˜ ์†Œ์Šค๋Š” friendํ•จ์ˆ˜๊ฐ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€
๋ฐœ์ƒํ•˜๋Š”๋Œ€์š” ์•Œ์•„๋ณด๋‹ˆ๊นŒ VC+
+์˜ ๋ฒ„๊ทธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์„œ๋น„์ŠคํŒฉ 5๋ฅผ ๊นŒ์‹œ๊ฑฐ๋‚˜
.NET์„ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. SP5๋Š” 2003/4 ํ˜„์žฌ ์•„๋ž˜ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ๋ฐ›์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
http://www.microsoft.com/downloads/details.aspx?FamilyID=9066d31d -ba23-4e8a-b7c8-
b95f5e54f896&DisplayLang=ko#filelist)
6.2 A List of person Objects
์œ„์˜ SETPERS ์˜ˆ์ œ์—์„œ, set์ด๋‚˜ multimap์œผ๋กœ ์ฃผ์–ด์ง„ ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฅด๋‹ค.
๊ทธ๋ ‡์ง€๋งŒ, person ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ์ œํ•˜๊ธฐ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค๋ฉด list์˜ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.
// listpers.cpp // uses a list to hold person objects
#include <iostream>
#include <list>
#include <algorithm>
#include <string>
using namespace std;
class person
{
private:
string lastName;
string firstName;
long phoneNumber;
public:
person () : lastName ("blank"),
firstName ("blank"), phoneNumber (0L)
{ }
person (string lana, string fina, long pho) :
lastName (lana), firstName (fina), phoneNumber (pho)
{ }
friend bool operator < (const person&, const person&);
friend bool operator == (const person&, const person&);
friend bool operator != (const person&, const person&);
friend bool operator > (const person&, const person&);
void display () const { // display person's data
cout << endl << lastName << ",t" << firstName
<< "ttphone: " << phoneNumber;
}
long get_phone () const {
return phoneNumber;
}
};
bool operator < (const person& p1, const person& p2)
{
if (p1.lastName == p2.lastName)
return (p1.firstName < p2.firstName) ? true : false;
return (p1.lastName < p2.lastName) ? true : false;
}
bool operator == (const person& p1, const person& p2)
{
if (p1.lastName == p2.lastName && p1.firstName == p2.firstName)
return true;
return false;
}
bool operator != (const person& p1, const person& p2)
{
return !(p1 == p2);
}
bool operator > (const person& p1, const person& p2)
{
return !(p1 < p2) && !(p1 == p2);
}
int main ()
{
list <person> persList; // list of person
list <person>::iterator iter1; // iterator to a list of persons
// put persons in list
persList.push_back (person("Deauville", "William", 8435150));
persList.push_back (person("McDonald", "Stacey", 3327536));
persList.push_back (person("Bartoski", "Peter", 6946473));
persList.push_back (person("KuangThu", "Bruce", 4157300));
persList.push_back (person("Wellington", "Jhon", 9207400));
persList.push_back (person("McDonald", "Amanda", 8435150));
persList.push_back (person("Fredericks", "Roger", 7049982));
persList.push_back (person("McDonald", "Stacey", 7764987));
cout << "nNumber of entries = " << persList.size();
iter1 = persList.begin (); // display contents of list
while ( iter1 != persList.end() )
(*iter1++).display();
// find person or person with specified name (last and first)
string searchLastName, searchFirstName;
cout << "nnEnter last name of person to search for: ";
cin >> searchLastName;
cout << "Enter first name: ";
cin >> searchFirstName;
// make a person with that name
person searchPerson (searchLastName, searchFirstName, 0L);
// search for first match of names
iter1 = find (persList.begin(), persList.end(), searchPerson);
// find additional matches
if ( iter1 != persList.end() ) {
cout << "Person(s) with that name is(are)";
do {
(*iter1).display (); // display match
+
+iter1; // search again, one past match
iter1 = find (iter1, persList.end(), searchPerson);
} while (iter1 != persList.end());
}
else
cout << "There is no person with that name.";
// find person or persons with specified phone number
cout << "nnEnter phone number (format 12345678): ";
long sNumber; // get search number
cin >> sNumber;
// iterate through list
bool found_one = false;
for (iter1=persList.begin(); iter1!=persList.end(); iter1++) {
if (sNumber == (*iter1).get_phone()) { // compare numbers
if (!found_one) {
cout << "Person(s) with that phone number is(are)";
found_one = true;
}
(*iter1).display();
}
}
if (!found_one)
cout << "There is no person with that phone number";
cout << endl;
return 0;
}
//////////////////////////////////////////////////////////////////////////
์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ํ• ๋•Œ:
์œ„์˜ ์˜ˆ์ œ๋Š” list๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋•Œ๋ฌธ์— lower_bound()/upper_bound() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ
์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋Œ€์‹ ์— ๊ฒ€์ƒ‰์„ ํ•˜๊ธฐ์œ„ํ•ด find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ list์˜
๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ๋น„๊ตํ•˜๊ฒŒ๋œ๋‹ค. ์šฐ์„  ์ตœ์ดˆ๊ฒ€์ƒ‰์„ ํ•˜๊ณ , ๋ฐœ๊ฒฌ๋˜๋ฉด ๊ทธ ๋‹ค์Œ ์œ„์น˜๋ถ€ํ„ฐ
๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ๊ณ„์† ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰ find()๋ฅผ ๋‘๋ฒˆ ์จ์•ผํ•œ๋‹ค.
Phone Number๋กœ ๊ฒ€์ƒ‰ํ• ๋•Œ:
find()๋Š” ๊ฒ€์ƒ‰ํ•˜๊ธฐ์œ„ํ•ด 1์ฐจ์  ๊ฒ€์ƒ‰ ํŠน์„ฑ(primary search characteristic)์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์–ด๋ ต๋‹ค. ์˜ˆ์ œ์—์„œ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด brute force ๊ธฐ๋ฒ•์„
์‚ฌ์šฉํ•˜์˜€๋‹ค. ์ด ๊ธฐ๋ฒ•์€ ๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ˆ˜๋™์ ์œผ๋กœ
๋น„๊ตํ•ด๋‚˜๊ฐ„๋‹ค.
if ( sNumber == (*iter).get_phone() )
...
ํ”„๋กœ๊ทธ๋žจ์€ ๋จผ์ € ๋ชจ๋“  ์—”ํŠธ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ ๋‚˜์„œ ๊ฒ€์ƒ‰ํ•  ์ด๋ฆ„์„ ๋ฌป๋Š”๋‹ค. ์ž…๋ ฅ๋ฐ›์€ ์ด๋ฆ„์„
์ฐพ์•„์„œ ์ถœ๋ ฅํ•ด์ฃผ๊ณ , ๋‹ค์Œ๊ณผ์ •์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๋ฌป๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œํ•œ๋ฒˆ ๊ฒ€์ƒ‰์„
ํ•˜๊ฒŒ๋œ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
STL.doc
STL.doc
STL.doc
STL.doc
STL.doc
STL.doc
STL.doc
STL.doc
STL.doc
STL.doc
STL.doc
STL.doc

More Related Content

Similar to STL.doc

[2015-06-12] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 1
[2015-06-12] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 1[2015-06-12] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 1
[2015-06-12] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 1Seok-joon Yun
ย 
๊ฐ•์˜์ž๋ฃŒ4
๊ฐ•์˜์ž๋ฃŒ4๊ฐ•์˜์ž๋ฃŒ4
๊ฐ•์˜์ž๋ฃŒ4Young Wook Kim
ย 
R ํ”„๋กœ๊ทธ๋žจ์˜ ์ดํ•ด์™€ ํ™œ์šฉ v1.1
R ํ”„๋กœ๊ทธ๋žจ์˜ ์ดํ•ด์™€ ํ™œ์šฉ v1.1R ํ”„๋กœ๊ทธ๋žจ์˜ ์ดํ•ด์™€ ํ™œ์šฉ v1.1
R ํ”„๋กœ๊ทธ๋žจ์˜ ์ดํ•ด์™€ ํ™œ์šฉ v1.1happychallenge
ย 
Bind Peeking ํ•œ๊ณ„์— ๋”ฐ๋ฅธ Adaptive Cursor Sharing ๋“ฑ์žฅ_Wh oracle
Bind Peeking ํ•œ๊ณ„์— ๋”ฐ๋ฅธ Adaptive Cursor Sharing ๋“ฑ์žฅ_Wh oracleBind Peeking ํ•œ๊ณ„์— ๋”ฐ๋ฅธ Adaptive Cursor Sharing ๋“ฑ์žฅ_Wh oracle
Bind Peeking ํ•œ๊ณ„์— ๋”ฐ๋ฅธ Adaptive Cursor Sharing ๋“ฑ์žฅ_Wh oracle์—‘์…ˆ
ย 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10hungrok
ย 
Json view ์˜ˆ์ œ ์„ค๋ช…
Json view ์˜ˆ์ œ ์„ค๋ช…Json view ์˜ˆ์ œ ์„ค๋ช…
Json view ์˜ˆ์ œ ์„ค๋ช…Hyung Eun Jin
ย 
Amazon aurora 2
Amazon aurora 2Amazon aurora 2
Amazon aurora 2EXEM
ย 
Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6Shin heemin
ย 
[SOPT] ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” - #02 : ์Šคํƒ, ํ, ์ˆ˜์‹ ์—ฐ์‚ฐ
[SOPT] ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” - #02 : ์Šคํƒ, ํ, ์ˆ˜์‹ ์—ฐ์‚ฐ[SOPT] ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” - #02 : ์Šคํƒ, ํ, ์ˆ˜์‹ ์—ฐ์‚ฐ
[SOPT] ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” - #02 : ์Šคํƒ, ํ, ์ˆ˜์‹ ์—ฐ์‚ฐS.O.P.T - Shout Our Passion Together
ย 
Fundamentals of Oracle SQL
Fundamentals of Oracle SQLFundamentals of Oracle SQL
Fundamentals of Oracle SQLJAEGEUN YU
ย 
Memcached์˜ ํ™•์žฅ์„ฑ ๊ฐœ์„ 
Memcached์˜ ํ™•์žฅ์„ฑ ๊ฐœ์„ Memcached์˜ ํ™•์žฅ์„ฑ ๊ฐœ์„ 
Memcached์˜ ํ™•์žฅ์„ฑ ๊ฐœ์„ NAVER D2
ย 
PL/SQL - 10g Release1
PL/SQL - 10g Release1PL/SQL - 10g Release1
PL/SQL - 10g Release1Michael/Taewoo Kim
ย 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7Chris Ohk
ย 
C++ Advanced ๊ฐ•์˜ 4์ฃผ์ฐจ
 C++ Advanced ๊ฐ•์˜ 4์ฃผ์ฐจ C++ Advanced ๊ฐ•์˜ 4์ฃผ์ฐจ
C++ Advanced ๊ฐ•์˜ 4์ฃผ์ฐจHyunJoon Park
ย 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1Hyosang Hong
ย 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1Hyosang Hong
ย 

Similar to STL.doc (20)

[2015-06-12] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 1
[2015-06-12] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 1[2015-06-12] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 1
[2015-06-12] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 1
ย 
๊ฐ•์˜์ž๋ฃŒ4
๊ฐ•์˜์ž๋ฃŒ4๊ฐ•์˜์ž๋ฃŒ4
๊ฐ•์˜์ž๋ฃŒ4
ย 
ES6 for Node.js Study 2์ฃผ์ฐจ
ES6 for Node.js Study 2์ฃผ์ฐจES6 for Node.js Study 2์ฃผ์ฐจ
ES6 for Node.js Study 2์ฃผ์ฐจ
ย 
R ํ”„๋กœ๊ทธ๋žจ์˜ ์ดํ•ด์™€ ํ™œ์šฉ v1.1
R ํ”„๋กœ๊ทธ๋žจ์˜ ์ดํ•ด์™€ ํ™œ์šฉ v1.1R ํ”„๋กœ๊ทธ๋žจ์˜ ์ดํ•ด์™€ ํ™œ์šฉ v1.1
R ํ”„๋กœ๊ทธ๋žจ์˜ ์ดํ•ด์™€ ํ™œ์šฉ v1.1
ย 
1.7 ํŠœ๋‹์˜๋„๊ตฌ sql autorace
1.7 ํŠœ๋‹์˜๋„๊ตฌ sql autorace1.7 ํŠœ๋‹์˜๋„๊ตฌ sql autorace
1.7 ํŠœ๋‹์˜๋„๊ตฌ sql autorace
ย 
Bind Peeking ํ•œ๊ณ„์— ๋”ฐ๋ฅธ Adaptive Cursor Sharing ๋“ฑ์žฅ_Wh oracle
Bind Peeking ํ•œ๊ณ„์— ๋”ฐ๋ฅธ Adaptive Cursor Sharing ๋“ฑ์žฅ_Wh oracleBind Peeking ํ•œ๊ณ„์— ๋”ฐ๋ฅธ Adaptive Cursor Sharing ๋“ฑ์žฅ_Wh oracle
Bind Peeking ํ•œ๊ณ„์— ๋”ฐ๋ฅธ Adaptive Cursor Sharing ๋“ฑ์žฅ_Wh oracle
ย 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10
ย 
Json view ์˜ˆ์ œ ์„ค๋ช…
Json view ์˜ˆ์ œ ์„ค๋ช…Json view ์˜ˆ์ œ ์„ค๋ช…
Json view ์˜ˆ์ œ ์„ค๋ช…
ย 
Amazon aurora 2
Amazon aurora 2Amazon aurora 2
Amazon aurora 2
ย 
Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6
ย 
[SOPT] ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” - #02 : ์Šคํƒ, ํ, ์ˆ˜์‹ ์—ฐ์‚ฐ
[SOPT] ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” - #02 : ์Šคํƒ, ํ, ์ˆ˜์‹ ์—ฐ์‚ฐ[SOPT] ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” - #02 : ์Šคํƒ, ํ, ์ˆ˜์‹ ์—ฐ์‚ฐ
[SOPT] ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ„ฐ๋”” - #02 : ์Šคํƒ, ํ, ์ˆ˜์‹ ์—ฐ์‚ฐ
ย 
C++ stl
C++ stlC++ stl
C++ stl
ย 
Fundamentals of Oracle SQL
Fundamentals of Oracle SQLFundamentals of Oracle SQL
Fundamentals of Oracle SQL
ย 
Memcached์˜ ํ™•์žฅ์„ฑ ๊ฐœ์„ 
Memcached์˜ ํ™•์žฅ์„ฑ ๊ฐœ์„ Memcached์˜ ํ™•์žฅ์„ฑ ๊ฐœ์„ 
Memcached์˜ ํ™•์žฅ์„ฑ ๊ฐœ์„ 
ย 
PL/SQL - 10g Release1
PL/SQL - 10g Release1PL/SQL - 10g Release1
PL/SQL - 10g Release1
ย 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
ย 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl
ย 
C++ Advanced ๊ฐ•์˜ 4์ฃผ์ฐจ
 C++ Advanced ๊ฐ•์˜ 4์ฃผ์ฐจ C++ Advanced ๊ฐ•์˜ 4์ฃผ์ฐจ
C++ Advanced ๊ฐ•์˜ 4์ฃผ์ฐจ
ย 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
ย 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
ย 

More from Daniel Shin

<๋งˆ๋ธ” ํ”„๋กœ์ ํŠธ> ์†Œ์„ค, ์‹œ๋‚˜๋ฆฌ์˜ค, ๋งŒํ™”, ์• ๋‹ˆ๋ฉ”์ด์…˜. ์ธ๋ฌธํ•™ ์œก์„ฑ์‚ฌ์—…
<๋งˆ๋ธ” ํ”„๋กœ์ ํŠธ>  ์†Œ์„ค, ์‹œ๋‚˜๋ฆฌ์˜ค, ๋งŒํ™”, ์• ๋‹ˆ๋ฉ”์ด์…˜. ์ธ๋ฌธํ•™ ์œก์„ฑ์‚ฌ์—…<๋งˆ๋ธ” ํ”„๋กœ์ ํŠธ>  ์†Œ์„ค, ์‹œ๋‚˜๋ฆฌ์˜ค, ๋งŒํ™”, ์• ๋‹ˆ๋ฉ”์ด์…˜. ์ธ๋ฌธํ•™ ์œก์„ฑ์‚ฌ์—…
<๋งˆ๋ธ” ํ”„๋กœ์ ํŠธ> ์†Œ์„ค, ์‹œ๋‚˜๋ฆฌ์˜ค, ๋งŒํ™”, ์• ๋‹ˆ๋ฉ”์ด์…˜. ์ธ๋ฌธํ•™ ์œก์„ฑ์‚ฌ์—…Daniel Shin
ย 
์ธ๊ณต์ง€๋Šฅ๋ฐœํ‘œ-๊ทผํƒœ.ppt ์œ ์ „์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ ์˜์ƒ ํŠน์ง• ์ถ”์ถœ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๋ฐ•๊ทผํƒœ
์ธ๊ณต์ง€๋Šฅ๋ฐœํ‘œ-๊ทผํƒœ.ppt ์œ ์ „์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ ์˜์ƒ ํŠน์ง• ์ถ”์ถœ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๋ฐ•๊ทผํƒœ์ธ๊ณต์ง€๋Šฅ๋ฐœํ‘œ-๊ทผํƒœ.ppt ์œ ์ „์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ ์˜์ƒ ํŠน์ง• ์ถ”์ถœ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๋ฐ•๊ทผํƒœ
์ธ๊ณต์ง€๋Šฅ๋ฐœํ‘œ-๊ทผํƒœ.ppt ์œ ์ „์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ ์˜์ƒ ํŠน์ง• ์ถ”์ถœ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๋ฐ•๊ทผํƒœDaniel Shin
ย 
0_์†Œ๊ณต ๋””์ž์ธ.pdf ATM๋””์ž์ธ ์„ค๊ณ„ ๋ฌธ์„œ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต 2024๋…„ 2์›” 20์ผ ๊ฒŒ์‹œ
0_์†Œ๊ณต ๋””์ž์ธ.pdf ATM๋””์ž์ธ ์„ค๊ณ„ ๋ฌธ์„œ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต 2024๋…„ 2์›” 20์ผ ๊ฒŒ์‹œ0_์†Œ๊ณต ๋””์ž์ธ.pdf ATM๋””์ž์ธ ์„ค๊ณ„ ๋ฌธ์„œ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต 2024๋…„ 2์›” 20์ผ ๊ฒŒ์‹œ
0_์†Œ๊ณต ๋””์ž์ธ.pdf ATM๋””์ž์ธ ์„ค๊ณ„ ๋ฌธ์„œ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต 2024๋…„ 2์›” 20์ผ ๊ฒŒ์‹œDaniel Shin
ย 
๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด-์‹ ๋™์ธ 2024๋…„2์›”20์ผ ๊ฒŒ์‹œ ๋ ˆ๋ณผ๋ฃจ์…˜ ๋ฐœํ‘œ์ž๋ฃŒ
๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด-์‹ ๋™์ธ 2024๋…„2์›”20์ผ ๊ฒŒ์‹œ ๋ ˆ๋ณผ๋ฃจ์…˜ ๋ฐœํ‘œ์ž๋ฃŒ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด-์‹ ๋™์ธ 2024๋…„2์›”20์ผ ๊ฒŒ์‹œ ๋ ˆ๋ณผ๋ฃจ์…˜ ๋ฐœํ‘œ์ž๋ฃŒ
๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด-์‹ ๋™์ธ 2024๋…„2์›”20์ผ ๊ฒŒ์‹œ ๋ ˆ๋ณผ๋ฃจ์…˜ ๋ฐœํ‘œ์ž๋ฃŒDaniel Shin
ย 
๋ฆฌ์–ผ ์—ฐ์˜ˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐํš์„œ ์—…๋ฌด์ถ”์ง„๊ณ„ํš์„œ ์œค์ฃผ์šฉ ๊ธธํƒœ์šฑ ์‹ ๋™์ธ 2011๋…„ 4์›” 7์ผ
๋ฆฌ์–ผ ์—ฐ์˜ˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐํš์„œ ์—…๋ฌด์ถ”์ง„๊ณ„ํš์„œ ์œค์ฃผ์šฉ ๊ธธํƒœ์šฑ ์‹ ๋™์ธ 2011๋…„ 4์›” 7์ผ๋ฆฌ์–ผ ์—ฐ์˜ˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐํš์„œ ์—…๋ฌด์ถ”์ง„๊ณ„ํš์„œ ์œค์ฃผ์šฉ ๊ธธํƒœ์šฑ ์‹ ๋™์ธ 2011๋…„ 4์›” 7์ผ
๋ฆฌ์–ผ ์—ฐ์˜ˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐํš์„œ ์—…๋ฌด์ถ”์ง„๊ณ„ํš์„œ ์œค์ฃผ์šฉ ๊ธธํƒœ์šฑ ์‹ ๋™์ธ 2011๋…„ 4์›” 7์ผDaniel Shin
ย 
์–Œ๋ฏธ๋ฅด2 ๊ฒŒ์ž„๊ธฐํš์„œ.doc ์ด์™•ํฌ ๋ ˆ๋ณผ๋ฃจ์…˜ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ๋ฏธ์™„์„ฑ
์–Œ๋ฏธ๋ฅด2 ๊ฒŒ์ž„๊ธฐํš์„œ.doc ์ด์™•ํฌ ๋ ˆ๋ณผ๋ฃจ์…˜ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ๋ฏธ์™„์„ฑ์–Œ๋ฏธ๋ฅด2 ๊ฒŒ์ž„๊ธฐํš์„œ.doc ์ด์™•ํฌ ๋ ˆ๋ณผ๋ฃจ์…˜ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ๋ฏธ์™„์„ฑ
์–Œ๋ฏธ๋ฅด2 ๊ฒŒ์ž„๊ธฐํš์„œ.doc ์ด์™•ํฌ ๋ ˆ๋ณผ๋ฃจ์…˜ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ๋ฏธ์™„์„ฑDaniel Shin
ย 
๋ฐฐํ‹€์ฒด์ŠคGO ๊ธฐํš์„œ ์ดˆ์•ˆ 20220616v2 ์›์ž‘์ž: ์‹ ๋™์ธ 2024๋…„1์›”26์ผ ๋ฐœํ–‰
๋ฐฐํ‹€์ฒด์ŠคGO ๊ธฐํš์„œ ์ดˆ์•ˆ 20220616v2 ์›์ž‘์ž: ์‹ ๋™์ธ 2024๋…„1์›”26์ผ ๋ฐœํ–‰๋ฐฐํ‹€์ฒด์ŠคGO ๊ธฐํš์„œ ์ดˆ์•ˆ 20220616v2 ์›์ž‘์ž: ์‹ ๋™์ธ 2024๋…„1์›”26์ผ ๋ฐœํ–‰
๋ฐฐํ‹€์ฒด์ŠคGO ๊ธฐํš์„œ ์ดˆ์•ˆ 20220616v2 ์›์ž‘์ž: ์‹ ๋™์ธ 2024๋…„1์›”26์ผ ๋ฐœํ–‰Daniel Shin
ย 
๋š๋”ฑํ•œ๊ตญ์š”๋ฆฌ ํ™”๋ฉด์„ค๊ณ„ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ์›์ž‘์ž: ๊น€๋•ํ˜ธ, ์‹ ๋™์ธ
๋š๋”ฑํ•œ๊ตญ์š”๋ฆฌ ํ™”๋ฉด์„ค๊ณ„ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ์›์ž‘์ž: ๊น€๋•ํ˜ธ, ์‹ ๋™์ธ๋š๋”ฑํ•œ๊ตญ์š”๋ฆฌ ํ™”๋ฉด์„ค๊ณ„ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ์›์ž‘์ž: ๊น€๋•ํ˜ธ, ์‹ ๋™์ธ
๋š๋”ฑํ•œ๊ตญ์š”๋ฆฌ ํ™”๋ฉด์„ค๊ณ„ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ์›์ž‘์ž: ๊น€๋•ํ˜ธ, ์‹ ๋™์ธDaniel Shin
ย 
3D์ฐฝ์ž‘๋™ํ™”์ „์ง‘ ๋””์ง€ํ„ธ์ปจํ…์ธ  ์‚ฌ์—…๊ณ„ํš์„œ 20230404v2.doc
3D์ฐฝ์ž‘๋™ํ™”์ „์ง‘ ๋””์ง€ํ„ธ์ปจํ…์ธ  ์‚ฌ์—…๊ณ„ํš์„œ 20230404v2.doc3D์ฐฝ์ž‘๋™ํ™”์ „์ง‘ ๋””์ง€ํ„ธ์ปจํ…์ธ  ์‚ฌ์—…๊ณ„ํš์„œ 20230404v2.doc
3D์ฐฝ์ž‘๋™ํ™”์ „์ง‘ ๋””์ง€ํ„ธ์ปจํ…์ธ  ์‚ฌ์—…๊ณ„ํš์„œ 20230404v2.docDaniel Shin
ย 
์ธํ„ฐ๋„ท ์˜ค๋ฝ์‹ค๊ฒŒ์ž„ ์‚ฌ์—…๊ณ„ํš์„œ_20230320v2.doc
์ธํ„ฐ๋„ท ์˜ค๋ฝ์‹ค๊ฒŒ์ž„ ์‚ฌ์—…๊ณ„ํš์„œ_20230320v2.doc์ธํ„ฐ๋„ท ์˜ค๋ฝ์‹ค๊ฒŒ์ž„ ์‚ฌ์—…๊ณ„ํš์„œ_20230320v2.doc
์ธํ„ฐ๋„ท ์˜ค๋ฝ์‹ค๊ฒŒ์ž„ ์‚ฌ์—…๊ณ„ํš์„œ_20230320v2.docDaniel Shin
ย 
๋ดํ‹ฐ์Šค ๋ฉด์ ‘ ํฌํŠธํด๋ฆฌ์˜ค_์‹ ๋™์ธv1.docx
๋ดํ‹ฐ์Šค ๋ฉด์ ‘ ํฌํŠธํด๋ฆฌ์˜ค_์‹ ๋™์ธv1.docx๋ดํ‹ฐ์Šค ๋ฉด์ ‘ ํฌํŠธํด๋ฆฌ์˜ค_์‹ ๋™์ธv1.docx
๋ดํ‹ฐ์Šค ๋ฉด์ ‘ ํฌํŠธํด๋ฆฌ์˜ค_์‹ ๋™์ธv1.docxDaniel Shin
ย 
C์–ธ์–ด๊ฐ•์˜ ๋ฐœํ‘œ์ž๋ฃŒ 1๊ฐ•.pptx
C์–ธ์–ด๊ฐ•์˜ ๋ฐœํ‘œ์ž๋ฃŒ 1๊ฐ•.pptxC์–ธ์–ด๊ฐ•์˜ ๋ฐœํ‘œ์ž๋ฃŒ 1๊ฐ•.pptx
C์–ธ์–ด๊ฐ•์˜ ๋ฐœํ‘œ์ž๋ฃŒ 1๊ฐ•.pptxDaniel Shin
ย 
ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ_20220908v2_์‹ ๋™์ธ.pptx
ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ_20220908v2_์‹ ๋™์ธ.pptxํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ_20220908v2_์‹ ๋™์ธ.pptx
ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ_20220908v2_์‹ ๋™์ธ.pptxDaniel Shin
ย 
resume20220510v3.pptx
resume20220510v3.pptxresume20220510v3.pptx
resume20220510v3.pptxDaniel Shin
ย 
๋ฏธ๋‹ˆ๋ฉ”ํƒ€๋ฒ„์Šคv5.pptx
๋ฏธ๋‹ˆ๋ฉ”ํƒ€๋ฒ„์Šคv5.pptx๋ฏธ๋‹ˆ๋ฉ”ํƒ€๋ฒ„์Šคv5.pptx
๋ฏธ๋‹ˆ๋ฉ”ํƒ€๋ฒ„์Šคv5.pptxDaniel Shin
ย 
์นดํˆฐ์›”๋“œ๊ธฐํš์„œ.pptx
์นดํˆฐ์›”๋“œ๊ธฐํš์„œ.pptx์นดํˆฐ์›”๋“œ๊ธฐํš์„œ.pptx
์นดํˆฐ์›”๋“œ๊ธฐํš์„œ.pptxDaniel Shin
ย 
ํ”„๋กœ์ ํŠธ_์„ฑ๊ณตํ•˜๋Š”_๋ฒ•.pptx
ํ”„๋กœ์ ํŠธ_์„ฑ๊ณตํ•˜๋Š”_๋ฒ•.pptxํ”„๋กœ์ ํŠธ_์„ฑ๊ณตํ•˜๋Š”_๋ฒ•.pptx
ํ”„๋กœ์ ํŠธ_์„ฑ๊ณตํ•˜๋Š”_๋ฒ•.pptxDaniel Shin
ย 
3D์นดํˆฐ๋ฉ”์ด์ปค ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜(๋ณต๊ตฌ๋จ)
3D์นดํˆฐ๋ฉ”์ด์ปค ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜(๋ณต๊ตฌ๋จ)3D์นดํˆฐ๋ฉ”์ด์ปค ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜(๋ณต๊ตฌ๋จ)
3D์นดํˆฐ๋ฉ”์ด์ปค ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜(๋ณต๊ตฌ๋จ)Daniel Shin
ย 
3D ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜2์ฃผ์ฐจ
3D ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜2์ฃผ์ฐจ3D ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜2์ฃผ์ฐจ
3D ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜2์ฃผ์ฐจDaniel Shin
ย 
๋ฐฑ์—…์„ ์œ„ํ•œ USB์šด์˜์ฒด์ œ ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜
๋ฐฑ์—…์„ ์œ„ํ•œ USB์šด์˜์ฒด์ œ ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜๋ฐฑ์—…์„ ์œ„ํ•œ USB์šด์˜์ฒด์ œ ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜
๋ฐฑ์—…์„ ์œ„ํ•œ USB์šด์˜์ฒด์ œ ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜Daniel Shin
ย 

More from Daniel Shin (20)

<๋งˆ๋ธ” ํ”„๋กœ์ ํŠธ> ์†Œ์„ค, ์‹œ๋‚˜๋ฆฌ์˜ค, ๋งŒํ™”, ์• ๋‹ˆ๋ฉ”์ด์…˜. ์ธ๋ฌธํ•™ ์œก์„ฑ์‚ฌ์—…
<๋งˆ๋ธ” ํ”„๋กœ์ ํŠธ>  ์†Œ์„ค, ์‹œ๋‚˜๋ฆฌ์˜ค, ๋งŒํ™”, ์• ๋‹ˆ๋ฉ”์ด์…˜. ์ธ๋ฌธํ•™ ์œก์„ฑ์‚ฌ์—…<๋งˆ๋ธ” ํ”„๋กœ์ ํŠธ>  ์†Œ์„ค, ์‹œ๋‚˜๋ฆฌ์˜ค, ๋งŒํ™”, ์• ๋‹ˆ๋ฉ”์ด์…˜. ์ธ๋ฌธํ•™ ์œก์„ฑ์‚ฌ์—…
<๋งˆ๋ธ” ํ”„๋กœ์ ํŠธ> ์†Œ์„ค, ์‹œ๋‚˜๋ฆฌ์˜ค, ๋งŒํ™”, ์• ๋‹ˆ๋ฉ”์ด์…˜. ์ธ๋ฌธํ•™ ์œก์„ฑ์‚ฌ์—…
ย 
์ธ๊ณต์ง€๋Šฅ๋ฐœํ‘œ-๊ทผํƒœ.ppt ์œ ์ „์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ ์˜์ƒ ํŠน์ง• ์ถ”์ถœ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๋ฐ•๊ทผํƒœ
์ธ๊ณต์ง€๋Šฅ๋ฐœํ‘œ-๊ทผํƒœ.ppt ์œ ์ „์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ ์˜์ƒ ํŠน์ง• ์ถ”์ถœ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๋ฐ•๊ทผํƒœ์ธ๊ณต์ง€๋Šฅ๋ฐœํ‘œ-๊ทผํƒœ.ppt ์œ ์ „์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ ์˜์ƒ ํŠน์ง• ์ถ”์ถœ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๋ฐ•๊ทผํƒœ
์ธ๊ณต์ง€๋Šฅ๋ฐœํ‘œ-๊ทผํƒœ.ppt ์œ ์ „์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ ์˜์ƒ ํŠน์ง• ์ถ”์ถœ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๋ฐ•๊ทผํƒœ
ย 
0_์†Œ๊ณต ๋””์ž์ธ.pdf ATM๋””์ž์ธ ์„ค๊ณ„ ๋ฌธ์„œ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต 2024๋…„ 2์›” 20์ผ ๊ฒŒ์‹œ
0_์†Œ๊ณต ๋””์ž์ธ.pdf ATM๋””์ž์ธ ์„ค๊ณ„ ๋ฌธ์„œ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต 2024๋…„ 2์›” 20์ผ ๊ฒŒ์‹œ0_์†Œ๊ณต ๋””์ž์ธ.pdf ATM๋””์ž์ธ ์„ค๊ณ„ ๋ฌธ์„œ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต 2024๋…„ 2์›” 20์ผ ๊ฒŒ์‹œ
0_์†Œ๊ณต ๋””์ž์ธ.pdf ATM๋””์ž์ธ ์„ค๊ณ„ ๋ฌธ์„œ ๊ฒฝ๋ถ๋Œ€ํ•™๊ต 2024๋…„ 2์›” 20์ผ ๊ฒŒ์‹œ
ย 
๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด-์‹ ๋™์ธ 2024๋…„2์›”20์ผ ๊ฒŒ์‹œ ๋ ˆ๋ณผ๋ฃจ์…˜ ๋ฐœํ‘œ์ž๋ฃŒ
๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด-์‹ ๋™์ธ 2024๋…„2์›”20์ผ ๊ฒŒ์‹œ ๋ ˆ๋ณผ๋ฃจ์…˜ ๋ฐœํ‘œ์ž๋ฃŒ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด-์‹ ๋™์ธ 2024๋…„2์›”20์ผ ๊ฒŒ์‹œ ๋ ˆ๋ณผ๋ฃจ์…˜ ๋ฐœํ‘œ์ž๋ฃŒ
๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด-์‹ ๋™์ธ 2024๋…„2์›”20์ผ ๊ฒŒ์‹œ ๋ ˆ๋ณผ๋ฃจ์…˜ ๋ฐœํ‘œ์ž๋ฃŒ
ย 
๋ฆฌ์–ผ ์—ฐ์˜ˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐํš์„œ ์—…๋ฌด์ถ”์ง„๊ณ„ํš์„œ ์œค์ฃผ์šฉ ๊ธธํƒœ์šฑ ์‹ ๋™์ธ 2011๋…„ 4์›” 7์ผ
๋ฆฌ์–ผ ์—ฐ์˜ˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐํš์„œ ์—…๋ฌด์ถ”์ง„๊ณ„ํš์„œ ์œค์ฃผ์šฉ ๊ธธํƒœ์šฑ ์‹ ๋™์ธ 2011๋…„ 4์›” 7์ผ๋ฆฌ์–ผ ์—ฐ์˜ˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐํš์„œ ์—…๋ฌด์ถ”์ง„๊ณ„ํš์„œ ์œค์ฃผ์šฉ ๊ธธํƒœ์šฑ ์‹ ๋™์ธ 2011๋…„ 4์›” 7์ผ
๋ฆฌ์–ผ ์—ฐ์˜ˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ธฐํš์„œ ์—…๋ฌด์ถ”์ง„๊ณ„ํš์„œ ์œค์ฃผ์šฉ ๊ธธํƒœ์šฑ ์‹ ๋™์ธ 2011๋…„ 4์›” 7์ผ
ย 
์–Œ๋ฏธ๋ฅด2 ๊ฒŒ์ž„๊ธฐํš์„œ.doc ์ด์™•ํฌ ๋ ˆ๋ณผ๋ฃจ์…˜ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ๋ฏธ์™„์„ฑ
์–Œ๋ฏธ๋ฅด2 ๊ฒŒ์ž„๊ธฐํš์„œ.doc ์ด์™•ํฌ ๋ ˆ๋ณผ๋ฃจ์…˜ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ๋ฏธ์™„์„ฑ์–Œ๋ฏธ๋ฅด2 ๊ฒŒ์ž„๊ธฐํš์„œ.doc ์ด์™•ํฌ ๋ ˆ๋ณผ๋ฃจ์…˜ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ๋ฏธ์™„์„ฑ
์–Œ๋ฏธ๋ฅด2 ๊ฒŒ์ž„๊ธฐํš์„œ.doc ์ด์™•ํฌ ๋ ˆ๋ณผ๋ฃจ์…˜ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ๋ฏธ์™„์„ฑ
ย 
๋ฐฐํ‹€์ฒด์ŠคGO ๊ธฐํš์„œ ์ดˆ์•ˆ 20220616v2 ์›์ž‘์ž: ์‹ ๋™์ธ 2024๋…„1์›”26์ผ ๋ฐœํ–‰
๋ฐฐํ‹€์ฒด์ŠคGO ๊ธฐํš์„œ ์ดˆ์•ˆ 20220616v2 ์›์ž‘์ž: ์‹ ๋™์ธ 2024๋…„1์›”26์ผ ๋ฐœํ–‰๋ฐฐํ‹€์ฒด์ŠคGO ๊ธฐํš์„œ ์ดˆ์•ˆ 20220616v2 ์›์ž‘์ž: ์‹ ๋™์ธ 2024๋…„1์›”26์ผ ๋ฐœํ–‰
๋ฐฐํ‹€์ฒด์ŠคGO ๊ธฐํš์„œ ์ดˆ์•ˆ 20220616v2 ์›์ž‘์ž: ์‹ ๋™์ธ 2024๋…„1์›”26์ผ ๋ฐœํ–‰
ย 
๋š๋”ฑํ•œ๊ตญ์š”๋ฆฌ ํ™”๋ฉด์„ค๊ณ„ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ์›์ž‘์ž: ๊น€๋•ํ˜ธ, ์‹ ๋™์ธ
๋š๋”ฑํ•œ๊ตญ์š”๋ฆฌ ํ™”๋ฉด์„ค๊ณ„ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ์›์ž‘์ž: ๊น€๋•ํ˜ธ, ์‹ ๋™์ธ๋š๋”ฑํ•œ๊ตญ์š”๋ฆฌ ํ™”๋ฉด์„ค๊ณ„ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ์›์ž‘์ž: ๊น€๋•ํ˜ธ, ์‹ ๋™์ธ
๋š๋”ฑํ•œ๊ตญ์š”๋ฆฌ ํ™”๋ฉด์„ค๊ณ„ 2024๋…„ 1์›” 26์ผ ๋ฐœํ–‰ ์›์ž‘์ž: ๊น€๋•ํ˜ธ, ์‹ ๋™์ธ
ย 
3D์ฐฝ์ž‘๋™ํ™”์ „์ง‘ ๋””์ง€ํ„ธ์ปจํ…์ธ  ์‚ฌ์—…๊ณ„ํš์„œ 20230404v2.doc
3D์ฐฝ์ž‘๋™ํ™”์ „์ง‘ ๋””์ง€ํ„ธ์ปจํ…์ธ  ์‚ฌ์—…๊ณ„ํš์„œ 20230404v2.doc3D์ฐฝ์ž‘๋™ํ™”์ „์ง‘ ๋””์ง€ํ„ธ์ปจํ…์ธ  ์‚ฌ์—…๊ณ„ํš์„œ 20230404v2.doc
3D์ฐฝ์ž‘๋™ํ™”์ „์ง‘ ๋””์ง€ํ„ธ์ปจํ…์ธ  ์‚ฌ์—…๊ณ„ํš์„œ 20230404v2.doc
ย 
์ธํ„ฐ๋„ท ์˜ค๋ฝ์‹ค๊ฒŒ์ž„ ์‚ฌ์—…๊ณ„ํš์„œ_20230320v2.doc
์ธํ„ฐ๋„ท ์˜ค๋ฝ์‹ค๊ฒŒ์ž„ ์‚ฌ์—…๊ณ„ํš์„œ_20230320v2.doc์ธํ„ฐ๋„ท ์˜ค๋ฝ์‹ค๊ฒŒ์ž„ ์‚ฌ์—…๊ณ„ํš์„œ_20230320v2.doc
์ธํ„ฐ๋„ท ์˜ค๋ฝ์‹ค๊ฒŒ์ž„ ์‚ฌ์—…๊ณ„ํš์„œ_20230320v2.doc
ย 
๋ดํ‹ฐ์Šค ๋ฉด์ ‘ ํฌํŠธํด๋ฆฌ์˜ค_์‹ ๋™์ธv1.docx
๋ดํ‹ฐ์Šค ๋ฉด์ ‘ ํฌํŠธํด๋ฆฌ์˜ค_์‹ ๋™์ธv1.docx๋ดํ‹ฐ์Šค ๋ฉด์ ‘ ํฌํŠธํด๋ฆฌ์˜ค_์‹ ๋™์ธv1.docx
๋ดํ‹ฐ์Šค ๋ฉด์ ‘ ํฌํŠธํด๋ฆฌ์˜ค_์‹ ๋™์ธv1.docx
ย 
C์–ธ์–ด๊ฐ•์˜ ๋ฐœํ‘œ์ž๋ฃŒ 1๊ฐ•.pptx
C์–ธ์–ด๊ฐ•์˜ ๋ฐœํ‘œ์ž๋ฃŒ 1๊ฐ•.pptxC์–ธ์–ด๊ฐ•์˜ ๋ฐœํ‘œ์ž๋ฃŒ 1๊ฐ•.pptx
C์–ธ์–ด๊ฐ•์˜ ๋ฐœํ‘œ์ž๋ฃŒ 1๊ฐ•.pptx
ย 
ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ_20220908v2_์‹ ๋™์ธ.pptx
ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ_20220908v2_์‹ ๋™์ธ.pptxํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ_20220908v2_์‹ ๋™์ธ.pptx
ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ_20220908v2_์‹ ๋™์ธ.pptx
ย 
resume20220510v3.pptx
resume20220510v3.pptxresume20220510v3.pptx
resume20220510v3.pptx
ย 
๋ฏธ๋‹ˆ๋ฉ”ํƒ€๋ฒ„์Šคv5.pptx
๋ฏธ๋‹ˆ๋ฉ”ํƒ€๋ฒ„์Šคv5.pptx๋ฏธ๋‹ˆ๋ฉ”ํƒ€๋ฒ„์Šคv5.pptx
๋ฏธ๋‹ˆ๋ฉ”ํƒ€๋ฒ„์Šคv5.pptx
ย 
์นดํˆฐ์›”๋“œ๊ธฐํš์„œ.pptx
์นดํˆฐ์›”๋“œ๊ธฐํš์„œ.pptx์นดํˆฐ์›”๋“œ๊ธฐํš์„œ.pptx
์นดํˆฐ์›”๋“œ๊ธฐํš์„œ.pptx
ย 
ํ”„๋กœ์ ํŠธ_์„ฑ๊ณตํ•˜๋Š”_๋ฒ•.pptx
ํ”„๋กœ์ ํŠธ_์„ฑ๊ณตํ•˜๋Š”_๋ฒ•.pptxํ”„๋กœ์ ํŠธ_์„ฑ๊ณตํ•˜๋Š”_๋ฒ•.pptx
ํ”„๋กœ์ ํŠธ_์„ฑ๊ณตํ•˜๋Š”_๋ฒ•.pptx
ย 
3D์นดํˆฐ๋ฉ”์ด์ปค ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜(๋ณต๊ตฌ๋จ)
3D์นดํˆฐ๋ฉ”์ด์ปค ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜(๋ณต๊ตฌ๋จ)3D์นดํˆฐ๋ฉ”์ด์ปค ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜(๋ณต๊ตฌ๋จ)
3D์นดํˆฐ๋ฉ”์ด์ปค ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜(๋ณต๊ตฌ๋จ)
ย 
3D ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜2์ฃผ์ฐจ
3D ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜2์ฃผ์ฐจ3D ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜2์ฃผ์ฐจ
3D ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜2์ฃผ์ฐจ
ย 
๋ฐฑ์—…์„ ์œ„ํ•œ USB์šด์˜์ฒด์ œ ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜
๋ฐฑ์—…์„ ์œ„ํ•œ USB์šด์˜์ฒด์ œ ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜๋ฐฑ์—…์„ ์œ„ํ•œ USB์šด์˜์ฒด์ œ ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜
๋ฐฑ์—…์„ ์œ„ํ•œ USB์šด์˜์ฒด์ œ ์™„๋ฃŒ์„ธ๋ฏธ๋‚˜
ย 

STL.doc

  • 1. -------------------------------------------------------------------------------- STL (Standard Templete Library) -form www.devpia.com VC+ + lecture ๋ฒˆ์—ญ : Yonghan, Yoon (yonghany@orgio.net) ํŽธ์ง‘ : Insik, You (kaerun@hanmail.net) ๏ƒŸ ์ฃผ์„(K: ) -------------------------------------------------------------------------------- THE WAITE GROUP"s Object-Oriented Programming in C+ + Third Edition Robert Lafore(Author) SAMS(Publisher) ๋ž€ ์ฑ…์—์„œ STL๋ถ€๋ถ„๋งŒ ๋ฒˆ์—ญํ•œ ๊ฒ๋‹ˆ๋‹ค. -------------------------------------------------------------------------------- 0. ๊ฐœ์š” STL์—์„œ ์ค‘์š”ํ•œ ์„ธ๊ฐ€์ง€ ์—”ํ‹ฐํ‹ฐ๋Š” containers, algorithms, iteraters์ด๋‹ค. containers: ๋ฉ”๋ชจ๋ฆฌ์— ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค. template class๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ์‰ฝ๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•  ์ˆ˜์žˆ๋‹ค. algorithms: -containers๊ฐ€ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ์‹œ์ ธ๋‹ค. (์˜ˆ, sort, copy, search,merge) - template class๋กœ ๊ตฌํ˜„๋จ(ํ•˜์ง€๋งŒ container์˜๋ฉค๋ฒ„๋Š” ์•„๋‹˜) iterators: - ํฌ์ธํ„ฐ ๊ฐœ๋…์„ ์ผ๋ฐ˜ํ™” ์‹œํ‚จ๊ฒƒ. - ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. - ํฌ์ธํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋“ฏ์ด iterator๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ iterator๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. - iterator๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— STL์—์„œ ํ•ต์‹ฌ ๋ถ€๋ถ„์ด๋‹ค. 1.์ฝ˜ํ…Œ์ด๋„ˆ ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ๋‚˜ int, float๊ฐ™์€ built-in ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค. STL์€ 7๊ฐ€์ง€ basic type์ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, basic type์—์„œ ์ƒ์†๋œ 3๊ฐ€์ง€ ํƒ€์ž…์ด ๋” ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  basic type์—์„œ ์ƒ์† ๋ฐ›๋Š” ์ž์‹ ๋งŒ์˜ ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์ˆ˜๋„ ์žˆ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ๋•Œ ์™œ C+ + ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฑฐ์ฅ? ์ด์ฏค์—์„œ ์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ถ๊ธˆํ•  ๊ฒƒ์ด๋‹ค. ๋ฐฐ์—ด์€ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“ค๊ณ  ์–ด๋–ค ์ƒํ™ฉ์—์„  ๋Š๋ฆฌ๋‹ค.
  • 2. STL์—์„œ ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” sequence, associative์˜ 2๊ฐ€์ง€ ๋ฉ”์ธ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ์š”์•ฝ๋œ๋‹ค. sequence ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” vector,list,deque๋กœ ๋ถ„๋ฅ˜๋˜๊ณ  associative ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” set, multiset,map, multimap์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค. ์—ฌ๊ธฐ์— ์ถ”๊ฐ€๋กœ sequence ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์†๋ฐ›์€ ๋ช‡๊ฐœ์˜ ํŠน์ˆ˜ํ•œ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์ด ์žˆ๋‹ค. (stack, queue,priority_queue) ๊ทธ๋Ÿผ ๋‹ค์Œ์— ์ฐจ๋ก€๋กœ ์ด ์นดํ…Œ๊ณ ๋ฆฌ๋“ค์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๊ธฐ๋กœ ํ•˜์ž. 1.1 sequence containers sequence ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ๊ฑฐ๋ฆฌ์— ๋Š˜์–ด์„  ์ง‘๋“ค์ฒ˜๋Ÿผ line์œผ๋กœ ์‹œ๊ฐํ™” ํ• ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ์„ ์ €์žฅํ•œ๋‹ค. ๊ฐ ์š”์†Œ๋“ค์€ ์„ ์„ ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ๋์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๊ฐ ์š”์†Œ๋“ค์€ ์–ด๋–ค ์š”์†Œ๋“ค์˜ ์•ž์— ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ๋’ค์— ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ C+ + ๋ฐฐ์—ด์ด sequence ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์˜ˆ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. C+ + ๋ฐฐ์—ด์˜ ํ•œ๊ฐ€์ง€ ๋ฌธ์ œ์ ์€ compile-time์— ๋ฐ˜๋“œ์‹œ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋ ์ง€๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์ผ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ์˜ ์ตœ๋Œ€๊ฐฏ์ˆ˜๋ฅผ ์ถ”์ธกํ•˜์—ฌ ์ถฉ๋ถ„ํžˆ ํฌ๊ฒŒ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐฐ์—ด ๊ณต๊ฐ„์ด ๋‚ญ๋น„๋˜๊ณ  ๋˜๋Š” ์‹คํ–‰ ๊ณต๊ฐ„ ๋ถ€์กฑ ์—๋Ÿฌ๋ฅผ ๋„์ถœํ•ด ๋‚ธ๋‹ค(์‹ฌ์ง€์–ด๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถฐ๋ฒ„๋ฆฌ๊ธฐ ๊นŒ์ง€ ํ•œ๋‹ค). vector ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ์ด๋Ÿฌํ•œ ๋ณต์žก์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฐฐ์—ด์˜ ๋˜๋‹ค๋ฅธ ๋ฌธ์ œ์ ์€ employee ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ employee์ด ์ด๋ฆ„์œผ๋กœ ์ •๋ ฌ ํ•˜๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ด๋ฆ„์ด L๋กœ ์‹œ์ž‘ํ•˜๋Š” employee๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค ํ• ๋•Œ M๋ถ€ํ„ฐ Z๊นŒ์ง€ ๋ชจ๋“  employee ๋ ˆ์ฝ”๋“œ๋ฅผ ์ด๋™์‹œ์ผœ์•ผ๋งŒ ํ•œ๋‹ค. ์ด ์ž‘์—…์€ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ๊ฒƒ์ด๋‹ค. STL์€ ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ๊ฐœ๋…์— ๊ธฐ์ดˆํ•œ list ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์„ธ๋ฒˆ์งธ sequence container๋Š” stack๊ณผ queue๋ฅผ ์กฐํ•ฉํ•œ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” deque ์ด๋‹ค. stack์€ last-in-first-out ๊ฐœ๋…์ด๊ณ , queue๋Š” first-in-first-out๊ฐœ๋…์ด๋‹ค. ๋”ฐ๋ผ์„œ deque๋Š” ์–‘๋์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ์‚ญ์ œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. deque๋ผ๋Š” ๋‹จ์–ด๋Š” Double-Ended-QUEeue๋ฅผ ์กฐํ•ฉํ•œ ๊ฒƒ์ด๋‹ค. ์œตํ†ต์„ฑ ์žˆ๋Š” ๋ฉ”์นด๋‹ˆ์ฆ˜์œผ๋กœ์จ deque์ž์ฒด๋กœ๋„ ์œ ์šฉํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ stack๊ณผ queue๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 3. ํ…Œ์ด๋ธ” 1.1 Basic sequence Container ================================================================================ ํŠน์ง• ์žฅ๋‹จ์  ================================================================================ ์ผ๋ฐ˜ C+ + ๋ฐฐ์—ด ๊ณ ์ •ํฌ๊ธฐ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์•ก์„ธ์Šค ์ค‘๊ฐ„๊ฐ’์˜ ์ถ”๊ฐ€ ์‚ญ์ œ ๋Š๋ฆผ. run-time์‹œ์— ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. -------------------------------------------------------------------------------- vector ์žฌ๋ฐฐ์น˜,ํ™•์žฅ๋ฐฐ์—ด ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์•ก์„ธ์Šค ์ค‘๊ฐ„๊ฐ’ ์ถ”๊ฐ€ ์‚ญ์ œ ๋Š๋ฆผ ๋์— ๊ฐ’ ์ถ”๊ฐ€ ์‚ญ์ œ๋Š” ๋น ๋ฆ„. -------------------------------------------------------------------------------- list Doubly linked list ์–ด๋–ค ์œ„์น˜์—์„œ๊ฑด ์ถ”๊ฐ€ ์‚ญ์ œ ๋น ๋ฆ„. ์–‘๋์—์„œ๋ถ€ํ„ฐ ์•ก์„ธ์Šค ๋น ๋ฆ„. ์ž„์˜ ์ ‘๊ทผ ๋Š๋ฆผ -------------------------------------------------------------------------------- deque vector์™€ ์œ ์‚ฌ , ๋น ๋ฅธ ์ž„์˜์ ‘๊ทผ(์ธ๋ฑ์Šค๋ฒˆํ˜ธ ์ด์šฉ) ๊ทธ๋Ÿฌ๋‚˜ ์–‘๋์—์„œ ์ค‘๊ฐ„๊ฐ’ ์ถ”๊ฐ€์‚ญ์ œ ๋Š๋ฆผ ์•ก์„ธ์Šค ๊ฐ€๋Šฅ ์–‘๋์—์„œ ๋น ๋ฅธ ์ถ”๊ฐ€์‚ญ์ œ(push & pop) ================================================================================ STL์„ ์ƒ์„ฑํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ํ—ค๋”๋ฅผ includeํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ) vector< int> aVect; // ints ๋ฒกํ„ฐ ์ƒ์„ฑ (K:ints = integer) ๋˜๋Š” list< airtime> depature_list; // airtime ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ์˜ˆ์ œ์—์„œ ์ฃผ๋ชฉํ•  ๊ฒƒ์€ STL ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ์Šค์Šค๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค.
  • 4. 1.2 Associate Containers associate ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” sequential์ด ์•„๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ํ‚ค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์•ก์„ธ์Šคํ•œ๋‹ค. ์–ด๋–ค ์ €์žฅ๋œ ์š”์†Œ๋“ค์„ ํŠน๋ณ„ํ•œ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์€ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋‹จ์–ด๋ฅผ ์ฐพ์•„๋ณด๋Š” ๋ณดํ†ต ์˜์–ด ์‚ฌ์ „๊ณผ ๊ฐ™๋‹ค. ํ‚ค๊ฐ’์„ ์ฃผ๋ฉด ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ์ด ๊ฐ’์„ ์š”์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ํ‚ค๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์‹ ์†ํ•˜๊ฒŒ ์—ฐ๊ด€๋œ ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. STL์—๋Š” set๊ณผ map์˜ ๋‘ ์ข…๋ฅ˜์˜ associative ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋น ๋ฅธ ๊ฒ€์ƒ‰,์ถ”๊ฐ€,์‚ญ์ œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. set๊ณผ map์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์ ํ•ฉํ•œ ๋งค์šฐ ์œตํ†ต์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ •๋ ฌ๊ณผ ์ž„์˜์ ‘๊ทผ์— ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์˜คํผ๋ ˆ์ด์…˜์€ ๋น„ํšจ์œจ์ ์ด๋‹ค. set์€ map๋ณด๋‹ค ์‰ฝ๊ณ  ์ฃผ๋กœ ์ด์šฉ๋œ๋‹ค. set์€ ํ‚ค๋ฅผ ํฌํ•จํ•œ ์•„์ดํ…œ ๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค. ํ‚ค๋Š” ์•„์ดํ…œ์„ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, set์œผ๋กœ person์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ €์žฅํ• ๋•Œ ์ด๋ฆ„์†์„ฑ์„ ํ‚ค๊ฐ’์œผ๋กœ ์ •๋ ฌํ•ด์„œ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰์„ ํ•ด์„œ ๋น ๋ฅด๊ฒŒ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. int๊ฐ™์€ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์ €์žฅํ•œ๋‹ค๋ฉด, ํ‚ค๋Š” int ๊ฐ™์€ ๊ธฐ๋ณธ ํƒ€์ž…์„ ํ†ต์งธ๋กœ ์ €์žฅ๋œ๋‹ค. ๋•Œ๋ก  ํ‚ค๊ฐ’์œผ๋กœ set์— ์ €์žฅ๋œ ์ „์ฒด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ the ์†์„ฑ์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค ์˜ค๋ธŒ์ ํŠธ๋ผ ๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค. ํ‚ค๋Š” ์ „์ฒด ์•„์ดํ…œ์ด ์•„๋‹ˆ๋‹ค. map์€ ํ‚ค(key)์™€ ๊ฐ’(value) ์˜ค๋ธŒ์ ํŠธ ์Œ์„ ์ €์žฅํ•œ๋‹ค. map์€ ์ข…์ข… ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ , ์ž„์˜ ํƒ€์ž…์„ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค์‹œ๋งํ•ด์„œ ํ‚ค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ธ๋ฑ์Šค ์—ญํ• ์„ ํ•˜๊ณ  value ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์ด ๋œ๋‹ค. set๊ณผ map ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ์ €์žฅ๋œ ๊ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ์˜ค์ง ํ•˜๋‚˜์˜ ํ‚ค๋งŒ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฐ˜๋ฉด์— multimap๊ณผ multiset ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” mulitple key๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Table 1.2 Basic Associative Containers ================================================================================ ํŠน์ง• ================================================================================ set ํ‚ค ์˜ค๋ธŒ์ ํŠธ๋งŒ ์ €์žฅํ•˜๊ณ  ๊ฐ value์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์˜ ํ‚ค๋งŒ ์ œ๊ณต. -------------------------------------------------------------------------------- multiset ํ‚ค ์˜ค๋ธŒ์ ํŠธ๋งŒ ์ €์žฅํ•˜์ง€๋งŒ ๋ณต์ˆ˜๊ฐœ์˜ ํ‚ค๋ฅผ ์ œ๊ณต. -------------------------------------------------------------------------------- map value์™€ ํ‚ค๋ฅผ ์—ฐ๊ด€์‹œํ‚ด. ๊ฐ value์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ํ‚ค๋งŒ ์ œ๊ณต. -------------------------------------------------------------------------------- multimap value์™€ ํ‚ค๋ฅผ ์—ฐ๊ด€์‹œํ‚ด. ๋ณต์ˆ˜๊ฐœ์˜ ํ‚ค๋ฅผ ์ œ๊ณต. ================================================================================
  • 5. associative ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ƒ์„ฑ์€ sequential ์ฝ˜ํ…Œ์ด๋„ˆ์ฒ˜๋Ÿผ ํ•˜๋ฉด๋œ๋‹ค. set< int> intSet; // ints์˜ set์„ ์ƒ์„ฑ ๋˜๋Š” multiset< employee> machinists; // employee์˜ multiset์„ ์ƒ์„ฑ 1.3 Member Functions ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ sorting์ด๋‚˜ searhing ๊ฐ™์€ ๋ณต์žกํ•œ ์˜คํผ๋ ˆ์ด์…˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๊ธฐ ์œ„ํ•ด STL์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ ์ฝ˜ํ…Œ์ด๋„ˆ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํŠน๋ณ„ํ•œ ํƒ€์ž…์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ…Œ์ด๋ธ” 1.3์€ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ˜ํ…Œ์ด๋„ˆ์— ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. Table 1.3 Some Member Functions Common All Containers ================================================================================ ์ด๋ฆ„ ๋ชฉ์  ================================================================================ size() ์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ์•„์ดํ…œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฆฌํ„ด -------------------------------------------------------------------------------- empty() ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ empty๋ฉด true๋ฅผ ๋ฆฌํ„ด -------------------------------------------------------------------------------- max_size() ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ํฌ๊ธฐ ๋ฆฌํ„ด -------------------------------------------------------------------------------- begin() ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘์ ์„ iterator๋กœ ๋ฆฌํ„ด, forward iteration -------------------------------------------------------------------------------- end() ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋์ ์„ iterator๋กœ ๋ฆฌํ„ด, end forward iteration -------------------------------------------------------------------------------- rbegin( ) backword iteration์„ ์œ„ํ•ด ์—ญ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” iterator๋ฅผ ๋ฆฌํ„ด -------------------------------------------------------------------------------- rend() rbegin()์˜ ๋ฐ˜๋Œ€ ๋์„ iterator๋กœ ๋ฆฌํ„ด ================================================================================ ์ด ๋ฐ–์—๋„ ๊ฐ๊ฐ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์ด ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋’ค๋กœ ๋ฏธ๋ฃจ๋„๋ก ํ•œ๋‹ค.
  • 6. 1.4 Container Adapters container adapter๋ผ ๋ถˆ๋ฆฌ๋Š” ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ์ผ๋ฐ˜์ ์ธ ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ ๋ถ€ํ„ฐ ํŠน๋ณ„ํ•œ ๋ชฉ์ ์„ ๊ฐ–๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ํŠน๋ณ„ํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์€ ์ผ๋ฐ˜์ ์ธ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค ๋ณด๋‹ค๋„ ๋” ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. STL์—์„œ ์ฝ˜ํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ๋กœ ๊ตฌํ˜„๋œ ํŠน๋ณ„ํ™”๋œ ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ๋Š” stacks, queues, ๊ทธ๋ฆฌ๊ณ  priority queues๋“ฑ์ด ์žˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์นœ์ˆ™ํ•œ ์Šคํƒ์€ ์Šคํƒ์˜ top์—์„œ ํ˜น์€ bottom์—์„œ pushing๊ณผ popping์ด ์ œํ•œ๋œ ์•ก์„ธ์Šค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ์—์„  ํ•œ์ชฝ ๋์—์„œ ์•„์ดํ…œ์„ pushํ•˜๊ณ  ๋‹ค๋ฅธ ํ•œ์ชฝ์—์„œ ๊ทธ ์•„์ดํ…œ์„ popํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ์„ ์ˆœ์œ„ ํ(priority queue) ์—์„œ๋Š” ์ž„์˜ ์ˆœ์„œ๋กœ ์ „๋ฐฉ์—์„œ ์•„์ดํ…œ์„ push ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ•œ์ชฝ์—์„œ ๊ทธ ์•„์ดํ…œ์„ popํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๊ฐ€์žฅ ํฐ ์•„์ดํ…œ ๋ถ€ํ„ฐ popํ•˜๊ฒŒ ๋œ๋‹ค(์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์ž๋™์œผ๋กœ ์ •๋ ฌ์„ ํ•œ๋‹ค). deque๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ธด ํ•˜์ง€๋งŒ ์Šคํƒ, ํ, ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ sequence ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ๋‹ค. ํ…Œ์ด๋ธ” 1.4๋Š” ์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€์ž…(abstract data type)๊ณผ ๊ตฌํ˜„์— ์‚ฌ์šฉ๋œ ์‹œํ€€์Šค ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค. Table 1.4 Adapter-Based Containers ================================================================================ Container Implementation Characteristics ================================================================================ stack vector, list, deque๋กœ ๊ตฌํ˜„ ํ•œ์ชฝ ๋์—์„œ๋งŒ push/pop ๊ฐ€๋Šฅ -------------------------------------------------------------------------------- queue list, deque๋กœ ๊ตฌํ˜„ ํ•œ์ชฝ์—์„œ push, ๋‹ค๋ฅธ์ชฝ์—์„œ pop -------------------------------------------------------------------------------- priority_queue vector๋‚˜ deque๋กœ ๊ตฌํ˜„ ํ•œ์ชฝ์—์„œ ์ž„์˜ ์ˆœ์„œ๋กœ push, ๋‹ค๋ฅธ ์ชฝ์—์„œ ์ €์žฅ๋œ ์ˆœ์„œ๋กœ pop ================================================================================ ์ค‘์ฒฉ๋œ ํ…œํ”Œ๋ฆฟ ์„ ์–ธ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ints ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ–๋Š” dequeํด๋ž˜์Šค๋กœ ์Šคํƒ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ• ๋•Œ, stack < deque< int>> aStack; ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ„ ์„ ์–ธ์„ ํ•  ๋•Œ ์ฃผ์˜ํ•  ๊ฒƒ์€ ">>" ์‚ฌ์šฉ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. stack < deque< int>> aStack; // syntaxerror ์ฒ˜๋Ÿผ ์„ ์–ธํ•˜๋ฉด syntax error๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ >> ๋ฅผ shift ์—ฐ์‚ฐ์ž๋กœ ํŒŒ์‹ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ์ธ "< < " ์˜ ์‚ฌ์šฉ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ด๋‹ค.
  • 7. 1.5 Algorithms ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฝ˜ํ…Œ์ด๋„ˆ(๋˜๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค)์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ญ”๊ฐ€๋ฅผ ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด๋‹ค. ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋“ฏ์ด STL์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฝ˜ํ…Œ์ด๋„ˆ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋„ ์•„๋‹ˆ๊ณ  ํ”„๋žœ๋“œ ํ•จ์ˆ˜๋„ ์•„๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์ด๊ฒƒ ๋˜ํ•œ ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜๋“ค์ด๋‹ค. ๋”ฐ๋ผ์„œ C+ + buit-in ๋ฐฐ์—ด์„ ์‚ฌ์šฉ ํ• ์ˆ˜ ๋„ ์žˆ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ์ฝ˜ํ…Œ์ด๋„ˆ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํ…Œ์ด๋ธ” 1.5๋Š” ๋ช‡๊ฐ€์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. Table 1.5 Some Typical Algorithms ================================================================================ Algorithm Purpose ================================================================================ find ์–ด๋–ค ๊ฐ’๊ณผ ๋™์ผํ•œ ์ตœ์ดˆ์˜ ๊ฐ’์„ ๋ฆฌํ„ด -------------------------------------------------------------------------------- count ์—˜๋ฆฌ๋จผํŠธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฆฌํ„ด -------------------------------------------------------------------------------- equal ๋‘ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๊ฐ™์œผ๋ฉด true๋ฅผ ๋ฆฌํ„ด -------------------------------------------------------------------------------- search ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๊ฐ™์€ ์‹œํ€€์Šค value์˜ ์‹œํ€€์Šค๋ฅผ ์ฐพ๋Š”๋‹ค. -------------------------------------------------------------------------------- copy ์‹œํ€€์Šค ๊ฐ’์„ ๋ณต์‚ฌ -------------------------------------------------------------------------------- swap ๊ฐ’์„ ์„œ๋กœ ๋ฐ”๊พผ๋‹ค. -------------------------------------------------------------------------------- iter_swap ์‹œํ€€์Šค ๊ฐ’์„ ์„œ๋กœ ๋ฐ”๊พผ๋‹ค. -------------------------------------------------------------------------------- fill ์‹œํ€€์Šค์˜ ํŠน์ • ์œ„์น˜์— ๊ฐ’์„ ์ฑ„์šด๋‹ค. -------------------------------------------------------------------------------- sort ์ง€์ •ํ•œ ์ˆœ์„œ๋กœ ์ •๋ ฌ์„ ํ•œ๋‹ค. -------------------------------------------------------------------------------- merge ๋‘๊ฐœ์˜ ์ €์žฅ์†Œ๋ฅผ ๊ฒฐํ•ฉํ•œ๋‹ค. -------------------------------------------------------------------------------- accumulate ์ฃผ์–ด์ง„ ๋ฒ”์œ„์˜ ๊ฐ’์„ ๋”ํ•œ๋‹ค. -------------------------------------------------------------------------------- for_each ๊ฐ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ ๊ฐ’์„ ํƒ์ƒ‰ ================================================================================
  • 8. ๋‹ค์Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” int ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž int arr[8] ={ 42, 31, 7, 80, 2, 26, 19, 75}; STL์˜ sort ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์จ์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค. sort (arr, arr+ 8); ์œ„์—์„œ arr์€ arr์˜ ์‹œ์ž‘ ์ฃผ์†Œ์ด๊ณ  arr+ 8์€ ๋ ์ฃผ์†Œ์ด๋‹ค. iterator๋Š” ํฌ์ธํ„ฐ ๋น„์Šทํ•˜๊ฒŒ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ์•„์ดํ…œ(์—˜๋ฆฌ๋จผํŠธ)์„ ์•ก์„ธ์Šคํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ์ด๋‹ค. ์ฃผ๋กœ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๋ฐ˜๋ณต(iterating)์— ์˜ํ•ด ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์„ ํ˜• ์ด๋™ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. + +์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ฆ๊ฐ€ํ•˜๋ฉด ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ญ์ฐธ์กฐ(dereference)์—ฐ์‚ฐ์ž *๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค. STL์—์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” iterator ํด๋ž˜์Šค๋กœ ํ‘œํ˜„๋œ๋‹ค. ์ฝ˜ํ…Œ์ด๋„ˆ์— ๋”ฐ๋ผ์„œ ์„œ๋กœ๋‹ค๋ฅธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋ฉฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ์ฃผ์š” 3 ๊ฐ€์ง€ ์ข…๋ฅ˜๋Š” forward, bi-directional, random access ์ด๋‹ค. forward ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์ƒ์—์„œ ํ•œ๋ฒˆ์— ํ•œ์•„์ดํ…œ์”ฉ ์ „๋ฐฉ ์ด๋™ ๋ฐ–์— ํ• ์ˆ˜ ์—†๋‹ค. ์ฆ‰, + +์˜คํผ๋ ˆ์ดํ„ฐ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค. ์ ˆ๋Œ€ ํ›„๋ฐฉ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๊ณ  ์ฝ˜ํ…Œ์ด๋„ˆ ์ค‘๊ฐ„์œ„์น˜๋กœ์˜ ์ž„์˜ ์„ค์ •์„ ํ•  ์ˆ˜ ์—†๋‹ค. bidirectional ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ „๋ฐฉ/ํ›„๋ฐฉ์œผ๋กœ ๋ชจ๋‘ ์ด๋™๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ + +์˜คํผ๋ ˆ์ดํ„ฐ์™€ --์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ •์˜๋˜์–ด ์žˆ๋‹ค. random access ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ „๋ฐฉ/ํ›„๋ฐฉ ์ด๋™๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž„์˜ ์œ„์น˜๋กœ ์ ํ”„ํ•  ์ˆ˜ ์žˆ๋‹ค. 1.6 Iterator Characteristics ================================================================================ Read/Write ์ €์žฅ๊ฐ€๋Šฅ ๋ฐฉํ–ฅ Access ================================================================================ Random Access R/W Yes ์ „๋ฐฉ/ํ›„๋ฐฉ Random -------------------------------------------------------------------------------- Bidirectional R/W Yes ์ „๋ฐฉ/ํ›„๋ฐฉ Linear -------------------------------------------------------------------------------- Forward R/W Yes ์ „๋ฐฉ Linear -------------------------------------------------------------------------------- Output W No ์ „๋ฐฉ Linear -------------------------------------------------------------------------------- Input R No ์ „๋ฐฉ Linear ================================================================================
  • 9. 1.7 STL์˜ ์ž ์žฌ์  ๋ฌธ์ œ(PotentialProblems with STL) STL์˜ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด์„œ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๋ฌด๋ฆฌ๋ฅผ ์ฃผ์–ด (K:์›๋ฌธ์ด ์ด๋ ‡๊ฒŒ ์จ์žˆ๋Š”๋Œ€ ์•„๋งˆ๋„ ์ž˜๋ชป ์“ด๊ฑฐ ๊ฐ™์Œ) ๋จผ์ €, ํ—ค๋”ํ™”์ผ์— ํฌํ•จ๋˜์–ด ์žˆ์–ด์„œ ์—๋Ÿฌ ์ฐพ๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ์œ ์ € ์ฝ”๋“œ์˜ ๋งค ๋ผ์ธ์— ์ฃผ์„์„ ๋‹ฌ์•„ ๋†“๋Š” ๊ธธ๋ฟ์ด๋‹ค. ํ”„๋ฆฌ์ปดํŒŒ์ผ๋“œ ํ—ค๋”์˜ ์‚ฌ์šฉ์œผ๋กœ ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋นจ๋ผ์ง€์ง€๋งŒ STL์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋Š๋ ค์ง€๊ฒŒ ํ•œ๋‹ค. STL์€ ์•„๋งˆ๋„ ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์†Œ์‹ค ๋œ๋‹ค๊ณ  ๊ฒฝ๊ณ ๋ฅผ ๋‚ด์ง€๋งŒ ์ด ๊ฒฝ๊ณ ๋Š” ๋ฌด์‹œํ•˜๋˜์ง€ disable ์‹œ์ผœ๋ฒ„๋ฆฌ๋ฉด ๋œ๋‹ค. 2 Algorithms STL์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ์ดํ„ฐ ์ฝœ๋ ‰์…˜์ƒ์—์„œ ์–ด๋–ค ์˜คํผ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ STL์ฝ˜ํ…Œ์ด๋„ˆ์™€ ๋™์ž‘ํ•˜๋„๋ก ๋””์ž์ธ ๋˜์–ด์žˆ์ง€๋งŒ ๋ณดํ†ต C+ + ๋ฐฐ์—ด์—๋„ ์ ์šฉ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์—ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ• ๋•Œ ์ƒ๋‹น๋ถ€๋ถ„์˜ ๋…ธ๊ฐ€๋‹ค๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 2.1 The find()Algorithm find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ค ๊ฐ’๋“ค์„ ๊ฐ€์ง„ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ์ผ์น˜ํ•˜๋Š” ์ฒซ๋ฒˆ์งธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฐพ๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. FIND ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์€ ints๋ฐฐ์—ด์—์„œ ์–ด๋–ป๊ฒŒ ์ฐพ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. // find.cpp // finds the first object with a specified value #include< iostream> #include< algorithm> // forfind () using namespace std; int arr[] ={ 11, 22, 33, 44, 55, 66, 77, 88}; int main () { int *ptr; ptr = find (arr, arr+ 8, 33); // ๋งจ ์ฒ˜์Œ ๋‚˜ํƒ€๋‚˜๋Š” 33์„ ์ฐพ๋Š”๋‹ค. cout << โ€œ33์„ ๊ฐ€์ง€๋Š” ์ฒซ๋ฒˆ์งธ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์œ„์น˜๋Š”โ€ << (ptr-arr) << endl; return 0; } (K:VC+ +์—์„œ ํ•œ๋‹ค๋ฉด return 0; ๋ฐ”๋กœ์ „์— getchar(); ๊ฐ™์€๊ฑธ ์จ์ฃผ๊ฑฐ๋‚˜ ๋ธŒ๋ž˜์ดํฌ ํฌ์ธํŠธ๋ฅผ ์ฐ์–ด์•ผํ•จ.) ๊ฒฐ๊ณผ 33์„ ๊ฐ€์ง€๋Š” ์ฒซ๋ฒˆ์งธ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์œ„์น˜๋Š” 2
  • 10. ์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ algorithm ํ™”์ผ์„ ์ธํด๋ฃจ๋“œํ–ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ• ๊ฒƒ์€ STL์—์„œ ํ—ค๋”ํ™”์ผ๋“ค์€ ํ™•์žฅ์ž(.H๋‚˜ .CP๊ฐ™์€P)๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. find()ํ•จ์ˆ˜์—์„œ ์ฒ˜์Œ ๋‘๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฒ”์œ„๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ C+ + ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ์—์„œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ด๋‹ค. ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ(ํฌ์ธํ„ฐ)์ด๊ณ  ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋งˆ์ง€๋ง‰ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋งํ•œ๋‹ค. ์œ„ ์˜ˆ์ œ๋ฅผ C+ +์˜ for ๋ฃจํ”„๋กœ ๋‹ค์‹œ ํ‘œํ˜„ํ•˜๋ฉด for (int j=0; j< 8; j+ +) // from 0to 7 { if (arr[j] == 33) { cout << โ€œ33์„ ๊ฐ€์ง€๋Š” ์ฒซ๋ฒˆ์งธ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ์œ„์น˜๋Š”โ€ << j << endl; break; } } FIND ์˜ˆ์ œ์˜ find()๋Š” for ๋ฃจํ”„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ์—†์• ์ค€๋‹ค. ์ข€๋” ๋ณต์žกํ•œ ์ƒํ™ฉ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„์ฃผ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ผ์„ ํ”ผํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. 2.2 The count()Algorithm count()๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ํŠน์ •ํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋ช‡๊ฐœ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณธ๋‹ค. COUNT ์˜ˆ์ œ๋ฅผ ๋ณด์ž. //count.cpp // countthe number of objects with a specified value. #include< iostream> #include< algorithm> // forcount() using namespace std; int arr[] ={ 33, 22, 33, 44, 33, 66, 77, 88}; int main() { int n =count (arr, arr+ 8, 33); // 33์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ผ๋‹ค. cout << โ€œ33์ด โ€ << n << โ€œ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค.โ€ << endl; return 0; }
  • 11. ๊ฒฐ๊ณผ: 33์ด 3๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค. 2.3 The sort() Algorithm ์•„๋งˆ sort() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ง์ž‘์ด ๊ฐˆ๊ฒƒ์ด๋‹ค. ๋ฐ”๋กœ SORT ์˜ˆ์ œ๋ฅผ ๋ณด์ž. // sort.cpp // integers ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค. #include< iostream> #include< algorithm> using namespace std; int arr[] ={ 45, 2, 22, -17, 0, -30, 25, 55}; int main() { sort (arr, arr+ 8); for (int j=0; j< 8; j+ +) cout << arr[j] << " "; return 0; } ๊ฒฐ๊ณผ: -30 -17 0 2 22 25 45 55 2.4 The search() Algorithm ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•œ๋ฒˆ์— ๋‘๊ฐœ์˜ ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ ์ž‘์—…ํ•œ๋‹ค. find()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹ฑ๊ธ€ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์ด์ง€๋งŒ, search()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ค ํ•œ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—ฐ์†๋˜๋Š” ๊ฐ’๋“ค(ํŒจํ„ด)์„ ๋‹ค๋ฅธ ํ•œ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ์ฐพ์•„๋ณธ๋‹ค. // search.cpp #include< iostream> #include< algorithm> using namespace std; int source [] = {11, 44, 33, 11, 22, 33, 11, 22, 44}; int pattern[] ={11, 22, 33};
  • 12. int main () { int *ptr; ptr = search(source,source+ 9, pattern,pattern+ 3); if (ptr == source+ 9) cout << โ€œNo match foundnโ€; else cout << โ€œMatch at โ€ << (ptr-source) << endl; return 0; } ๊ฒฐ๊ณผ: Match at 3 ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ’ ptr์ด source์˜ ๋๊นŒ์ง€ ๊ฐ”๋‹ค๋ฉด ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์†Œ๋ฆฌ์ด๋‹ค. 2.5 The merge() Algorithm 3๊ฐœ์˜ ์ฝ˜ํ…Œ๋„ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‘์—…์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ์จ 2๊ฐœ์˜ ์†Œ์Šค ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ํ•ฉํ•˜์—ฌ ๋ชฉ์  ์ฝ˜ํ…Œ์ด๋„ˆ์— ๋„ฃ๋Š”๋‹ค. // merge.cpp #include< iostream> #include< algorithm> using namespace std; int src1[] = { 2, 3, 4, 6, 9 }; int src2[] = { 1, 3, 5 }; int dest[8]; int main() { // src1๊ณผ src2๋ฅผ dest๋กœ mergeํ•œ๋‹ค. merge (src1, src1+ 5, src2, src2+ 3, dest); for (int j=0; j< 8; j+ +) cout << dest[j] << " "; cout << endl; return 0; }
  • 13. ๊ฒฐ๊ณผ : 1 2 3 3 4 5 6 9 ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์•Œ์ˆ˜ ์žˆ๋“ฏ์ด merge๋Š” ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. 2.6 Function Objects ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ธ์ž ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. ํ•จ์ˆ˜๊ฐ์ฒด๋Š” ๊ฒ‰์œผ๋กœ ๋ณด๊ธฐ์—” ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ฒด๋Š” ()์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•œ ์‹ฑ๊ธ€ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ (K:์˜ค๋ฒ„๋กœ๋“œ๋ž€ ํด๋ž˜์Šค์—์„œ ์—ฐ์‚ฐ์ž๋ฅผ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. Ex : C.Add(); -> C+ +;) ๊ฐ€์ง„ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค ๊ฐ์ฒด์ด๋‹ค. ์ด๊ฒƒ์€ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์•„์ฃผ ํŽธ๋ฆฌํ•˜๋‹ค. ๋ฐฐ์—ด์„ ascending(K:์˜ค๋ฅด๋Š”)์ด ์•„๋‹Œ descending์œผ๋กœ ์ •๋ ฌํ•˜๊ณ ์ž ํ•œ๋‹ค๊ณ  ํ•˜๊ณ  ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ๋ณด์ž. // sortemp.cpp #include<iostream> #include<algorithm> #include<functional> usingnamespace std; double fdata[] ={ 19.2, 87.4, 33.6, 55.0, 11.5, 42.2 }; int main() { sort ( fdata, fdata+ 6, greater<double>()); for (int j=0; j< 6; j+ +) cout << fdata[j] << " " << endl; return 0; } sort() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ ascending order๋กœ ์ •๋ ฌํ•˜์ง€๋งŒ greater< >() ํ•จ์ˆ˜๊ฐ์ฒด๋Š” ์ •๋ ฌ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฐ๊ณผ๋Š” 87.4 55 42.2 33.6 19.2 11.5 ์ด ์™ธ์—๋„ ์‚ฐ์ˆ  ์ด๋‚˜ ๋…ผ๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜๊ฐ์ฒด๊ฐ€ ๋” ์žˆ์œผ๋‚˜, ๋’ค์—์„œ ์ž์„ธํ•˜๊ฒŒ ๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.
  • 14. 2.6.1 ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๊ฐ์ฒด ํ•จ์ˆ˜๊ฐ์ฒด๋Š” ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค(+ ,< ,==,..)๊ณผ ํ•จ๊ป˜ ๊ธฐ๋ณธ C+ + ํƒ€์ž…๋“ค๊ณผ ํด๋ž˜์Šค๋งŒ ์ ์šฉ์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜๊ฐ์ฒด๋กœ ์“ฐ๊ณ ์ž ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜์ง€? ์˜ˆ๋กœ, < ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ char* ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ์œ„ํ•ด์„œ ๋น„๊ตํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ฒจ์คŒ๋กœ์จ ํ•จ์ˆ˜๊ฐ์ฒด ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. // sortcmp.cpp #include<iostream> #include<string> #include<algorithm> using namespace std; char *names[] ={"Geroge", "Penny", "Estelle", "Don", "Mike", "Bob"}; bool alpha_comp (char*, char*); int main() { sort (names, names+ 6, alpha_comp); for (int j=0; j< 6; j+ +) cout << names[j] << endl; return 0; } bool alpha_comp (char *s1, char* s2) // s1< s2์ด๋ฉด true๋ฅผ ๋ฆฌํ„ด { return ( strcmp ( s1, s2) < 0 ) ? true : false; } sort()์—์„œ 3๋ฒˆ์งธ ์ธ์ž๋Š” alpha_comp ํ•จ์ˆ˜์˜ ์ฃผ์†Œ์ด๋‹ค. ์œ„์˜ ๊ฒฐ๊ณผ๋Š” Bob Don Estelle George Mike Penny ์ด๋‹ค. ์ฆ‰ ์ด๋ฆ„์„ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.
  • 15. 2.7 Adding _if to Algorithms ์•Œ๊ณ ๋ฆฌ์ฆ˜์ค‘์—๋Š” ๋์— _if๊ฐ€ ๋ถ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์ธ ์†์„ฑ(predicate)์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ์˜ˆ๋กœ find()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ค ํŠน์ •ํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๋Š”๋‹ค. ๋˜ํ•œ find_if()์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋„ ์–ด๋–ค ์ถ”์ƒ์  ํŠน์ง•์„ ๊ฐ€์ง€๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฐพ๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” string๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. find_if()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ string ์˜ค๋ธŒ์ ํŠธ ๋ฐฐ์—ด์—์„œ Don์ด๋ž€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” string์„ ์ฐพ๋Š” isDon() ํ•จ์ˆ˜์˜ supprt๋ฅผ ๋ฐ›๋Š”๋‹ค. ์•„๋ž˜๋Š” FIND_IF์˜ ์ฝ”๋“œ์ด๋‹ค. // find_if.cpp #include<iostream> #include<string> #include<algorithm> using namespace std; string names[] ={โ€œGerogeโ€,โ€Estelleโ€, โ€œDonโ€, โ€œMikeโ€, โ€œBobโ€}; ///////////////////////////////////////////////////////////////// bool isDon(string name) { return name == "Don"; } ///////////////////////////////////////////////////////////////// int main() { string* ptr; ptr = find_if (names, names+ 5, isDon); if (ptr == names+ 5) cout << "Done is not on the list" << endl; else cout << "Don is element " << (ptr-names) << " on the list." << endl; return 0; } ///////////////////////////////////////////////////////////////// Don์€ ์‹ค์ œ list์— ์žˆ๊ธฐ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” Don iselement 2 on the list. ์ด๋‹ค.
  • 16. ์—ฌ๊ธฐ์„œ find_if()๋Š” ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ isDon()์œผ๋กœ ๋„˜๊ฒจ์ฃผ๊ณ  isDon์€ Don์„ ์ฐพ์œผ๋ฉด true๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋˜๊ณ  find_if๋ฅผ ๋น ์ ธ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. (K:Find()๋ฌธ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 3๋ฒˆ์งธ์— ์žˆ์œผ๋‹ˆ ์‹œ์ž‘์ด 0์ด๋ฏ€๋กœ 2๋ผ๊ณ  ํ‘œ์‹œ๋œ๋‹ค. ) ์ด๋ฐ–์—๋„ _if๋ฒ„์ „์œผ๋กœ ์ ์šฉ๋ ์ˆ˜ ์žˆ๋Š” count(), replace(),remove()๋“ฑ๋“ฑ์ด ์žˆ๋‹ค. 2.8 The for_each()Algorithm for_earch()๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ๋Œ€๋กœ ๋ญ”๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ญ”๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž ์ž‘์„ฑ ํ•จ์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ”๊ฟ€์ˆ˜๋Š” ์—†์ง€๋งŒ ์ฐธ์กฐ์™€ display๋Š” ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋Š” ์ธ์น˜๋ฅผ ์„ผํ‹ฐ๋ฏธํ„ฐ๋กœ ๋ฐ”๊พธ๊ณ  ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 2.54๋ฅผ ๊ณฑํ•˜๋Š” in_to_cm()ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  for_each() ์˜ ์„ธ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์†Œ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค. // for_each.cpp #include<iostream> #include<algorithm> using namespace std; void in_to_cm(double); int main() { double inches[] ={ 3.5, 6.2, 1.0, 12.75, 4.33 }; for_each (inches,inches+ 5, in_to_cm); cout << endl; return 0; } void in_to_cm(double in) { cout << (in * 2.54) << " "; } ๊ฒฐ๊ณผ๋Š” 8.89 15.748 2.54 32.385 10.9982
  • 17. 2.9 The transform() Algorithm transform()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ์—๊ฒŒ ๋ญ”๊ฐ€๋ฅผ ํ•˜๊ณ  ๋‹ค๋ฅธ ์ฝ˜๋„ค์ด๋„ˆ์—๊ฒŒ (๋˜๋Š” ๊ฐ™์€ ์ฝ˜ํ…Œ์ด๋„ˆ์—๊ฒŒ)์ด ๊ฒฐ๊ณผ๋ฅผ ์ „์†กํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ž‘์„ฑํ•จ์ˆ˜๋Š” ์—˜๋ฆฌ๋จผํŠธ์—๊ฒŒ ๋ญ˜ํ• ๊ฑด์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์‚ฌ์šฉ์ž ์ž‘์„ฑํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์€ ์ž…๋ ฅํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ์˜ ์˜ˆ๋Š” FOR_EACH์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ double []๋กœ ์ €์žฅํ•œ๋‹ค. // tranfo.cpp #include<iostream> #include<algorithm> using namespace std; double in_to_cm(double in) { return in * 2.54; } int main() { double inches[] ={ 3.5, 6.2, 1.0, 12.75, 4.33 }; double centi[5]; double in_to_cm(double); // prototype transform (inches, inches+ 5, centi, in_to_cm); for (int j=0; j<5; j+ +) cout << centi[j] << " " << endl; return 0; } ๊ฒฐ๊ณผ๋Š” FOR_EACH์™€ ๊ฐ™๋‹ค. ์ด์ œ๊นŒ์ง€ ๋‹จ์ง€ ๋ช‡๊ฐœ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์‚ดํˆ์ง€๋งŒ STL์—๋Š” ์ด๋ฐ–์—๋„ ์•„์ฃผ ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋‹จ์ง€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์‘์šฉ๊ฐ€๋Šฅํ•œ์ง€ ๋งŒ์„ ๋ณด์ธ ๊ฒƒ ๋ฟ์ด๋‹ค.
  • 18. 3 Sequential Containers ์ด๋ฏธ ์•ž์—์„œ ์‚ดํˆ๋“ฏ์ด STL ์ฝ˜ํ…Œ์ด๋„ˆ์—๋Š” 2๊ฐ€์ง€ ์ฃผ์š” ์นดํ…Œ๊ณ ๋ฆฌ๋กœ์จ sequence ์ฝ˜ํ…Œ์ด๋„ˆ ์™€ associative ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด๋ฒˆ ์žฅ์—์„œ๋Š” vector, list,deque์˜ 3๊ฐ€์ง€ ์‹œํ€€์Šค ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  ์ด ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค. iterator์— ๋Œ€ํ•ด ์•„์ง์€ ์ž์„ธํ•˜๊ฒŒ ๋ฐฐ์šฐ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค. iterator์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ์žฅ์—์„œ ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ๋„๋ก ํ•œ๋‹ค. ์•ž์œผ๋กœ ๋‚˜์˜ฌ ์˜ˆ์ œ๋“ค์€ ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡๊ฐ€์ง€ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋“ค๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ๊ธฐ์–ตํ•ด๋‘˜ ๊ฒƒ์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค๋„ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค. 3.1 Vectors ๋ฒกํ„ฐ๋Š” ์˜๋ฆฌํ•œ ๋ฐฐ์—ด(smart array)์ด๋ผ ์ƒ๊ฐํ•ด๋„ ์ข‹๋‹ค. ๋ฒกํ„ฐ๋Š” ์ €์žฅ์†Œ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ์— ๋”ฐ๋ผ ํฌ๊ธฐ๋ฅผ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œ์‹œํ‚จ๋‹ค. ๋ฒกํ„ฐ๋ฅผ []์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์จ์„œ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ๋ฒกํ„ฐ์—์„œ ์ด๋Ÿฌํ•œ ์ž„์˜์ ‘๊ทผ์€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ž‘๋™ ํ•œ๋‹ค. ๋˜ํ•œ push๋ฅผ ์ด์šฉํ•ด์„œ ๋ฒกํ„ฐ์˜ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด (์ถ”๊ฐ€๋˜๊ธฐ ์ง์ „์—) ํฌ๊ธฐ๋„ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. 3.1.1 Member Functions push_back(),size(), and operator[] ์ฒซ๋ฒˆ์งธ ์˜ˆ์ œ๋กœ VECTOR๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฒกํ„ฐ ์˜คํผ๋ ˆ์ด์…˜์„ ๋ณด์—ฌ์ค€๋‹ค. //vector.cpp #include<iostream> #include<vector> using namespace std; int main() { vector< int> v; // ints ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. v.push_back(10); // ๋ฐฐ์—ด์˜ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. v.push_back(11); v.push_back(12); v.push_back(13); v[0] = 20; v[3] = 23; // ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋Œ€์น˜ for (int j=0; j< v.size(); j+ +) // ๋ฒกํ„ฐ์˜ ๋‚ด์šฉ๋ฌผ์„ ์ถœ๋ ฅ cout << v[j] << " " ; return 0; }
  • 19. ๋ฒกํ„ฐ v๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ฒกํ„ฐ์˜ ๊ธฐ๋ณธ์ƒ์„ฑ์ž(no-argument)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ํฌ๊ธฐ๋ฅผ ์•Œ์ˆ˜ ์—†์œผ๋ฏ€๋กœ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. push_back()๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๋ฒกํ„ฐ์˜ ๋์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค. list๋‚˜ queue์ฒ˜๋Ÿผ ๋ฒกํ„ฐ์˜ ์‹œ์ž‘๋ถ€(index=0)์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž… ํ•  ์ˆ˜ ์—†๋‹ค. ์˜ˆ์ œ์—์„  10, 11, 12, 13์„ ์ถ”๊ฐ€ ํ–ˆ์œผ๋ฏ€๋กœ v[0]์€ 10, v[1] = 11, v[2] = 12, v[3]=13์ด๋‹ค. ์ผ๋‹จ ๋ฒกํ„ฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด [] ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ฝ๊ณ  ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์˜ˆ์ œ์—์„œ ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ v[0]=20์œผ๋กœ ๋ฐ”๊พธ๊ณ , v[3] = 23์œผ๋กœ ๋ฐ”๊ฟจ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ์ œ์˜ ๊ฒฐ๊ณผ๋Š” 20 11 12 23 ์ด ๋œ๋‹ค. size() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๋ฒกํ„ฐ์˜ ์—˜๋ฆฌ๋จผํŠธ ๊ฐฏ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์˜ˆ์ œ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋กœ๋Š” max_size()๊ฐ€ ์žˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ํ™•์žฅ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ด ์ˆ˜์น˜๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ผ ํ‹€๋ ค์ง€ ๊ฒŒ ๋œ๋‹ค. vector< int>์˜ max_size()๋Š” 1,073,741,823์„ ๋ฆฌํ„ดํ•  ๊ฒƒ์ด๋‹ค. 3.1.2 Member Functions swap(),empty(), back() and pop_back() ๋‹ค์Œ์˜ VECTOR๋Š” ๋ฒกํ„ฐ์˜ ์ถ”๊ฐ€์ ์ธ ์ƒ์„ฑ์ž์™€ ๋ฉค๋ฒ„ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃฌ๋‹ค. //vectcon.cpp #include< iostream> #include< vector> using namespace std; int main() { double arr[] ={1.1, 2.2, 3.3, 4.4}; vector< double> v1(arr,arr+ 4); // ๋ฒกํ„ฐ๋ฅผ arr๋กœ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค. vector< double> v2(4); // ํฌ๊ธฐ๊ฐ€ 4์ธ empty ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค v1.swap (v2); // v1๊ณผ v2์˜ ๊ฐ’์„ ๋งž๋ฐ”๊พผ๋‹ค. while (!v2.empty()) // v2๊ฐ€ ๋นŒ(empty)๋•Œ ๊นŒ์ง€ { cout << v2.back() << " "; // ๋งˆ์ง€๋ง‰ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ display v2.pop_back(); // ๋งˆ์ง€๋ง‰ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ญ์ œ } return 0; }
  • 20. ์œ„์—์„œ ๋‘๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋ฐฑํ„ฐ์˜ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์ฒซ๋ฒˆ์งธ ๋ฒกํ„ฐ v1์€ ๋ณดํ†ต C+ + ๋ฐฐ์—ด ์„ ๊ฐ€์ง€๊ณ  ์ดˆ๊ธฐํ™” ์‹œ์ผฐ๊ณ , ๋‘๋ฒˆ์งธ ๋ฒกํ„ฐ v2๋Š” ํฌ๊ธฐ๋งŒ ๊ฒฐ์ •ํ•˜์˜€๋‹ค. swap()๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ์—˜๋ฆฌ๋จผํŠธ์˜ order๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ”๊พธ๊ฒŒ ๋œ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ v2์™€ v1์˜ ๊ฐ’์„ ๋ฐ”๊ฟจ๊ธฐ ๋•Œ๋ฌธ์— v2๋ฅผ display์‹œ์ผœ๋ณด๋ฉด ๊ฒฐ๊ณผ๋Š” 4.4 3.3 2.2 1.1 ์ด ๋œ๋‹ค. back() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๋ฒกํ„ฐ์˜ ๋งจ ๋์— ์žˆ๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. pop_back() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๋ฒกํ„ฐ์˜ ๋งจ ๋์— ์žˆ๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฃจํ”„๋Š” ๋ฉ”๋ฒˆ ๋‹ค๋ฅธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถœ๋ ฅ ํ•˜๊ฒŒ ๋œ๋‹ค. swap() ๊ฐ™์€ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ๋˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋„ ์กด์žฌํ•œ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฒ„์ „๋ณด๋‹ค๋„ ํ•ด๋‹น ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๊ฐ€ ๋” ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋œ ๊ฒƒ์ด๋‹ค. ๋•Œ๋•Œ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ swap()์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋กœ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ๊ตํ™˜ํ• ์ˆ˜๋„ ์žˆ๋‹ค. 3.1.3 Member Functions insert()and erase() insert()์™€ erase()๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์ƒ์˜ ์ž„์˜์˜ ์œ„์น˜์— ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ ์ œ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์€ ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ insert๋‚˜ remove๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ ๋“ค์„ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์†๋„์™ธ์—๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ฒˆ ์˜ˆ์ œ๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์ง€๋ฅผ ๋ณด์ธ๋‹ค. //vectins.cpp #include<iostream> #include<vector> using namespace std; int main() { int arr[] ={100, 110, 120, 130}; vector< int> v(arr, arr+ 4); // ๋ฒกํ„ฐ๋ฅผ arr๋กœ ์ดˆ๊ธฐํ™” ์‹œํ‚จ๋‹ค. cout << "Before insertion : "; for (int j=0; j< v.size(); j+ +) cout << v[j] << " "; cout << endl; v.insert (v.begin()+ 2, 115);
  • 21. cout << "After insertion : "; for (j=0; j< v.size(); j+ +) cout << v[j] << " "; cout << endl; v.erase (v.begin()+ 2); cout << "After erasure : "; for (j=0; j< v.size(); j+ +) cout << v[j] << " "; cout << endl; return 0; } ๊ฒฐ๊ณผ: Before insertion: 100 110 120 130 After insertion: 100 110 115 120 130 After erasure: 100 110 120 130 3.2 Lists STL์˜ list ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” doubly linked list๋กœ์จ, ๊ฐ ์—˜๋ฆฌ๋จผํŠธ๋“ค์€ ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ์˜ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด์ „ ์—˜๋ฆฌ๋จผํŠธ์˜ ํฌ์ธํ„ฐ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ์–‘์ชฝ์œผ๋กœ ๋น ๋ฅธ ์ ‘๊ทผ์„ ์œ„ํ•ด ์—˜๋ฆฌ๋จผํŠธ์˜ ์•ž์ชฝ๊ณผ ๋’ค์ชฝ ๋ชจ๋‘๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค. 3.2.1 Member Functions push_front(),front(), and pop_front() ์ฒซ๋ฒˆ์งธ ์˜ˆ์ œ์ธ LIST๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์ฝ์–ด์˜ค๊ณ  ๋นผ๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค. // list.cpp #include<iostream> #include<list> using namespace std; int main() { list<int> ilist; ilist.push_back(30); ilist.push_back(40); ilist.push_front(20); ilist.push_front(10); int size = ilist.size();
  • 22. for (int j=0; j<size; j+ +) { cout << ilist.front() << " "; ilist.pop_front(); } cout << endl; return 0; } ๋ฐ์ดํ„ฐ๋ฅผ ์œ„,์•ž์—์„œ ์ถ”๊ฐ€ ํ•œ๋‹ค์Œ ์•ž์ชฝ๋ถ€ํ„ฐ displayํ•˜๊ณ  ์‚ญ์ œํ•˜์˜€๋‹ค. ๊ฒฐ๊ณผ๋Š” 10 20 30 40 ์ด๋‹ค. push_front(),pop_front(),front()๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์•ž์—์„œ ๋‹ค๋ฃฌ ๋ฒกํ„ฐ์˜ push_back(), pop_back(), back()๊ณผ ์œ ์‚ฌํ•˜๋‹ค. (K:๋‹ค๋งŒ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์•ž๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌ ํ•œ๋‹ค๋Š”๊ฒƒ๋งŒ ๋‹ค๋ฅด๋‹ค) ๋ฆฌ์ŠคํŠธ๋Š” ๋žœ๋ค ์•ก์„ธ์Šค ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์ŠคํŠธ๋กœ ๋žœ๋ค ์•ก์„ธ์Šค๋Š” ํ”ผํ•ด์•ผ ํ•จ์„ ์ฃผ๋ชฉํ•ด์•ผํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋•Œ๋ฌธ์— ๋ฆฌ์ŠคํŠธ์—๋Š” [] ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์—†๋‹ค. ์ •๋ง๋กœ ๋žœ๋ค ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฉด vector๋‚˜ deque๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ์ค‘๊ฐ„์— ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฝ์ž… ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ์—˜๋ฆฌ๋จผํŠธ์˜ ์ถ”๊ฐ€, ์‚ฝ์ž…์„ ์œ„ํ•ด ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— vector๋‚˜ deque์— ๋น„ํ•ด ํšจ์œจ์„ฑ์€ ๋–จ์–ด์ง€์ง€๋งŒ ํฌ์ธํ„ฐ๋งŒ ์ด๋™ํ•˜๋ฏ€๋กœ ๋น ๋ฅธํŽธ์— ์†ํ•œ๋‹ค. (๋ฌธ์ œ์ ์€ ์ถ”๊ฐ€,์‚ญ์ œ ํฌ์ธํ„ฐ๋ฅผ ์ฐพ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค) 3.2.2 Member Functions reserve(),merge(), and unique() ์–ด๋–ค ๋ฉค๋ฒ„ํ•จ์ˆ˜๋“ค์€ list์—๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ์˜ˆ์ œ LISTPLUS๋Š” ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค. // listplus.cpp #include<iostream> #include<list> using namespace std; int main() { int j; list <int> list1, list2; int arr1[] = {40, 30, 20, 10 }; int arr2[] = {15, 20, 25, 30, 35 };
  • 23. for (j=0; j<4; j+ +) list1.push_back( arr1[j]); for (j=0; j<5; j+ +) list2.push_back( arr2[j]); list1.reverse(); // list1์˜ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค. list1.merge(list2); // list1์— list2๋ฅผ ํฌํ•จ์‹œํ‚จ๋‹ค. list1.unique(); // ์ค‘๋ณต๋˜๋Š” ๊ฐ’์„ ์ œ๊ฑฐํ•œ๋‹ค. 20, 30 int size = list1.size(); while (!list1.empty()) { cout << list1.front() << " "; list1.pop_front(); } cout << endl; return 0; } ์ฒซ๋ฒˆ์งธ ๋ฆฌ์ŠคํŠธ๋Š” ์—ญ์ˆœ์œผ๋กœ ์ž…๋ ฅ๋˜์—ˆ๊ธฐ์— reverse()๋ฅผ ํ†ตํ•ด ์ •๋ ฌ์„ ํ•˜์˜€๋‹ค(์ด ๋™์ž‘์€ ์–‘ ๋์„ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๋งค์šฐ ๋น ๋ฅด๋‹ค.). merge()๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ € ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•ด์•ผ๋งŒํ•œ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ ๊ฒฐ๊ณผ๋Š” 10 20 30 40 15 20 25 30 35 ์ด๋‹ค. ์ด์ œ merge() ํ•จ์ˆ˜๋กœ list1๊ณผ list2๋ฅผ ๋ณ‘ํ•ฉํ•˜๋ฉด ์ •๋ ฌ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ณ‘ํ•ฉ๋œ๋‹ค. 10 15 20 20 25 30 30 35 40 ๋งˆ์ง€๋ง‰์œผ๋กœ list1์— unique() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ ์šฉ์‹œํ‚จ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๊ทผ์ ‘ํ•œ ์—˜๋ฆฌ๋จผํŠธ๋“ค์ด ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์งˆ ๊ฒฝ์šฐ ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ•˜๋‚˜๋งŒ ๋‚จ๊ธด๋‹ค. ๋”ฐ๋ผ์„œ list1์˜ ๋‚ด์šฉ์€ 10 15 20 25 30 35 40 ์ด ๋œ๋‹ค. ์ด ๊ฐ’์„ displayํ•˜๊ธฐ ์œ„ํ•ด front()์™€ pop_front()๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.
  • 24. 3.3 Deques ์–ด๋–ค ๋ฉด์—์„œ deque๋Š” vector์™€ ๋น„์Šทํ•˜๊ณ  ๋˜ ์–ด๋–ค ๋ฉด์—์„œ๋Š” list์™€ ๋น„์Šทํ•˜๋‹ค. vector์ฒ˜๋Ÿผ [] ์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์ง€์›ํ•˜๊ณ  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ list์ฒ˜๋Ÿผ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์•ž๋’ค์—์„œ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, deque๋Š” push_front(), pop_front(), front()๋ฅผ ์ง€์›ํ•˜๋Š” double-ended vector์˜ ์ผ์ข…์ด๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฒกํ„ฐ์™€ ํ์™€ ๋‹ค๋ฅด๊ฒŒ ํ• ๋‹น์ด ๋œ๋‹ค. ๋ฒกํ„ฐ๋Š” ํ•ญ์ƒ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น์ด ๋œ๋‹ค. ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง€๋ฉด ํฌ๊ธฐ๊ฐ€ ์•Œ๋งž๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค. ๋ฐ˜๋ฉด์— deque๋Š” ๋น„์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ(called segment)์— ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค. capacity() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์—˜๋ฆฌ๋จผํŠธ ๋ฒกํ„ฐ๊ฐ€ ์ด๋™์—†์ด ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ deque์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ด๋™๋  ํ•„์š”๊ฐ€ ์—†๊ธฐ๋•Œ๋ฌธ์— capacity()๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. //deque.cpp #include <iostream> #include <deque> using namespace std; int main() { deque<int> deq; deq.push_back(30); // push items on back deq.push_back(40); deq.push_back(50); deq.push_front(20); // push items on front deq.push_front(10); deq[2] = 33; // change middle item for (int j=0; j<deq.size(); j+ +) cout << deq[j] << ' '; // display items cout << endl; return 0; } ์•ž์—์„œ ์ด๋ฏธ push_back(), push_front(), operator []๋ฅผ ๋ฐฐ์› ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ์„ค๋ช…์ด ํ•„์š”์—†๋‹ค. deque๋„ ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ์ฒ˜๋Ÿผ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค. ๊ฒฐ๊ณผ๋Š” 10 20 33 40 50 ์ด๋‹ค.
  • 25. 4. Iterators ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์กฐ๊ธˆ ์‹ ๋น„์Šค๋Ÿฝ๊ฒŒ ๋ณด์ด๋ฉฐ์„œ STL์˜ ํ•ต์‹ฌ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์šฐ์„  ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜-์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๋‘๊ฐ€์ง€ ์—ญํ• ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ฒŒ ๋œ๋‹ค. ๋ฌผ๋ก  ์‚ฌ์šฉ๋ฒ•์€ ๋ช‡๋ช‡ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋ณด๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. 4.1 Iterators as Smart Pointers ์ข…์ข… ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋ชจ๋“ (๋˜๋Š” ์ผ๋ถ€ ์˜์—ญ) ์—˜๋ฆฌ๋จธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‘์—…์„ ํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๊ฐ๊ฐ์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ displayํ•˜๊ฑฐ๋‚˜ total์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’์„ ๋”ํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ „ํ†ต C+ + ๋ฐฐ์—ด์—์„œ ์ด๋Ÿฌํ•œ ์˜คํผ๋ ˆ์ด์…˜๋“ค์€ ํฌ์ธํ„ฐ๋ฅผ(๋˜๋Š” [] ์˜คํผ๋ ˆ์ดํ„ฐ) ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” float ๋ฐฐ์—ด์„ ์ˆœํšŒ(iterates)ํ•˜๊ณ  ๊ฐ ์—˜๋ฆฌ๋จธํŠธ์˜ ๊ฐ’์„ ๋ณด์—ฌ์ค€๋‹ค. float * ptr = start_address; for (int j=0; j<SIZE; j+ +) cout << *ptr+ +; ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด * ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์˜€๊ณ , ๋‹ค์Œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ์œ„ํ•ด + + ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค. 4.1.1 Ordinary Pointers Underpowered ๊ทธ๋Ÿฌ๋‚˜, ๊ณ ๊ธ‰ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์—์„œ, ํ‰๋ฒ”ํ•œ C+ + ํฌ์ธํ„ฐ๋Š” ์œ ์šฉํ•˜์ง€ ๋ชปํ•˜๋‹ค. ๋งŒ์ผ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ €์žฅ๋œ ์•„์ดํ…œ์ด ์—ฐ์†(contigious) ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํฌ์ธํ„ฐ ์ทจ๊ธ‰์ด ๋”์šฑ๋” ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ๋‹ค์Œ ์•„์ดํ…œ์œผ๋กœ ์ด๋™ํ• ๋•Œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ์•„์ดํ…œ์ด ๋ฐ”๋กœ ์˜†์— ์žˆ๋‹ค๊ณ  ์˜ˆ์ธกํ•  ์ˆ˜๊ฐ€ ์—†๊ธฐ๋•Œ๋ฌธ์— ์ฒ˜์Œ๋ถ€ํ„ฐ ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋จผ์ € ์ฐพ์•„๊ฐ€์•ผ๋งŒ ํ•œ๋‹ค. ๋˜ํ•œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ ์ฃผ์†Œ๋„ ์ €์žฅํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค. ์ด ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ดํ›„์— ์ด ๊ฐ’์„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ค‘๊ฐ„์—์„œ ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ–ˆ์„ ๊ฒฝ์šฐ ์ด ์ฝ˜ํ…Œ์ด๋„ˆ์— ๋ฌด์Šจ ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ? ์•„๋งˆ๋„ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ์žฌ์ •๋ ฌ ๋˜์ง€ ์•Š๋Š” ์ด์ƒ ์—ฐ์†์„ฑ์ด ๋Š์–ด์ง€๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ์‹œ ์ €์žฅ๋œ ํฌ์ธํ„ฐ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋ฉด ์ฐธ ์ข‹์„ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•œ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ "smart pointer"ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์ „ํ†ต์ ์ธ ํฌ์ธํ„ฐ๋กœ ๊ฐ์‹ผ๋‹ค. ๊ทธ๋ฆฌ๊ณ  + +์™€ * ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค์€ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๋น„๋ก ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋น„์—ฐ์†์ผ์ง€๋ผ๋„ ์–ด๋–ป๊ฒŒ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋‹ค๋ฃฐ์ง€๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•œ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์ œ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ๊ณจ๊ฒฉ๋งŒ ๋‚˜ํƒ€๋‚ธ๊ฒƒ์ด๋‹ค.
  • 26. class SmartPointer { private: float *p; // ํ‰๋ฒ”ํ•œ ํฌ์ธํ„ฐ public: float operator*() {} float operator+ +{} }; void main() { ... SmartPointer sptr = start_address; for (int j=0; j<SIZE; j+ +) cout << *ptr+ +; } 4.1.2 Whoes Responsibility? (๋ˆ„๊ฐ€ ์ฑ…์ž„์ง€์ง€?) SmartPointer ํด๋ž˜์Šค๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— ์†Œ์†(embed) ๋˜์–ด์•ผ๋งŒ ํ•˜๋‚˜? ์•„๋‹ˆ๋ฉด ๋…๋ฆฝ์ ์ด์–ด์•ผ๋งŒ ํ•˜๋‚˜? STL์ด ์„ ํƒํ•œ ํ•ด๊ฒฐ์ ์€ SmartPointer(์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”)๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์™€ ์™„์ „ํžˆ ๋…๋ฆฝ๋˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค(์‚ฌ์‹ค ํ…œํ”Œ๋ฆฟํ™” ํ•œ๊ฒƒ์ด๋‹ค). 4.1.3 ์ธํ„ฐํŽ˜์ด์Šค๋กœ์จ์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ(Iterators as an Interface) ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๋ง๊ณ , ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” STL์—์„œ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ์™œ ํ•„์š”ํ• ๊นŒ? ์ด๋ก ์  ์„ผ์Šค๋กœ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋ชจ๋“  ์ฝ˜ํ…Œ์ด๋„ˆ์— ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด STL์˜ ๊ฑฐ์˜ ๋ชจ๋“  ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ์—๊ฒŒ๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์ (์ฆ‰ slow)์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค. sort()์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜ˆ๋กœ ๋“ค์ž๋ฉด, ์ •๋ ฌ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋žœ๋ค์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋žœ๋ค์•ก์„ธ์Šค๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ ์—์„œ๋Š” ๋ฌด์กฐ๊ฑด ์ฒ˜์Œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•ด์„œ ์ •๋ ฌ์„ ์‹œ๋„ํ•ด์•ผ๋งŒ ํ• ๊ฒƒ์ด๋‹ค. -_-; ๋น„์Šทํ•œ ์˜ˆ๋กœ reverse() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋’ค์—์„œ(backword)๋ถ€ํ„ฐ ์•ก์„ธ์Šค๊ฐ€ ์ง€์›๋˜์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋†€๋ž๋„๋ก ๋ฉ‹์ง„ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ ํ•ฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉ์‹œํ‚จ๋‹ค. ์•ž์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์ปดํ“จํ„ฐ์™€ ํ”„๋ฆฐํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ผ€์ด๋ธ”์ด๋ผ ์ƒ๊ฐํ•ด๋ณด์ž. ์ผ€์ด๋ธ” ํ•œ์ชฝ ๋์— ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ํ”Œ๋Ÿฌ๊ทธํ•˜๊ณ  ๋‹ค๋ฅธ ํ•œ์ชฝ์—” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ”Œ๋Ÿฌ๊ทธํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๋ชจ๋“  ์ผ€์ด๋ธ”๋“ค์ด ๋ชจ๋“  ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ํ”Œ๋Ÿฌ๊ทธํ•  ์ˆ˜๋Š” ์—†๊ณ  ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ”Œ๋Ÿฌ๊ทธ ํ• ์ˆ˜๋„ ์—†๋‹ค.
  • 27. ๋งŒ์ผ ์ฃผ์–ด์ง„ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๋„ˆ๋ฌด ๋ฌด๋ฆฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ ค ํ•œ๋‹ค๋ฉด, ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ผ€์ด๋ธ”(์ดํ„ฐ๋ ˆ์ดํ„ฐ)์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค. ์ด๊ฑธ ์ปดํŒŒ์ผ ํ•ด๋ณด๋ฉด ์•„๋งˆ ์ปดํŒŒ์ผ๋Ÿฌ ์—๋Ÿฌ๋ฅผ ๋ณด๊ฒŒ๋ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์Šคํ‚ด์„ ์ž‘๋™์‹œํ‚ฌ๋ ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ข…๋ฅ˜์˜ ์ผ€์ด๋ธ”(์ดํ„ฐ๋ ˆ์ดํ„ฐ)๋“ค์ด ํ•„์š”ํ•˜๊ฒŒ ๋ ๊นŒ? ํ†ตํ„ธ์–ด์„œ 5๊ฐœ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆผ 4.3์€ ์ด 5๊ฐ€์ง€ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ๊ทธ๋ฆผ์€ ์ •๊ตํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ‘์—์„œ ๋ถ€ํ„ฐ ์œ„๋กœ ์ •๋ ฌ๋œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ์ƒ์†๊ด€๊ณ„๋Š” ์•„๋‹ˆ๋‹ค. + -----------------+ | Random Access | + -----------------+ | + -----------------+ | Bidirectional | + -----------------+ | + -----------------+ | Forward | + -----------------+ | | + -+ + -+ | | + -------------+ + -------------+ | Input | | Output | + -------------+ + -------------+ ๊ทธ๋ฆผ 1.3 ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์นดํ…Œ๊ณ ๋ฆฌ ๋งŒ์ผ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด readingํ•˜๋Š”๋ฐ(writing์ œ์™ธ) ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ „๋ฐฉ์ฐธ์กฐ๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” Input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ ๊ฒƒ์ด๋‹ค.์‚ฌ์‹ค Input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒŒ์ผ์—์„œ ์ฝ์„๋•Œ๋‚˜ cin์œผ๋กœ ์ฝ์„ ๋•Œ๋„ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ „๋ฐฉ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ฝ๋Š” ๊ฒƒ ๋Œ€์‹ ์— ์“ฐ๋Š”๊ฒŒ ํ•„์š”ํ•˜๋‹ค๋ฉด output ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ด๋‹ค. Output ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋„ Input์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒŒ์ผ์ด๋‚˜ cout์œผ๋กœ writeํ• ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด์ด๋„ˆ์˜ ์ „๋ฐฉ์ˆœํšŒ๋ฅผ ํ•˜๊ณ  ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋‘˜๋‹ค ์ง€์›ํ•˜๊ฒŒ ์‹ถ์„ ๋•Œ๋Š” forward ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์ „๋ฐฉ/ํ›„๋ฐฉ ์ˆœํšŒ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” bidirectional ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • 28. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์•„๋ฌด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” random ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์•„๋ฌด ์—˜๋ฆฌ๋จผํŠธ๋‚˜ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜๋‹ค. ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฐ์ˆ  ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. iter2 = iter1 + 7; Table 1.7 Capabilities of Different Iterator Categories ======================================================================== Step Step Random Forward Read Write Back Access Iterator Type + + value=*i *i=value -- [n] ======================================================================== Random access x x x x x ------------------------------------------------------------------------ Bidirectional x x x x ------------------------------------------------------------------------ Forward x x x ------------------------------------------------------------------------ Output x x ----------------------------------------------------------------------- input x x ======================================================================== ์œ„Table์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ชจ๋“  ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ค์ด ์ „๋ฐฉ์ˆœํšŒ๋ฅผ ํ•˜๋Š” + +์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค. input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ดํ€„ํ‘œ์‹œ ์˜ค๋ฅธ์ชฝ์—์„œ * ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(์™ผ์ชฝ์€ ์•ˆ๋œ๋‹ค) value = *iter; output ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” * ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์˜ค๋กœ์ง€ ์˜ค๋ฅธ์ชฝ์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค. *iter = value; ์ „๋ฐฉ์ˆœํšŒ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ชจ๋‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ณ , ๋‘๋ฐฉํ–ฅ(bidirectional) ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ฆ๊ฐ์„ ์ด์šฉํ•˜์—ฌ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๊ฐ„๋‹จํ•œ ์‚ฐ์ˆ  ์˜คํผ๋ ˆ์ดํ„ฐ์ธ - ๋‚˜ + ์ฒ˜๋Ÿผ [] ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์จ์„œ ์•„๋ฌด ์—˜๋ฆฌ๋จผํŠธ๋‚˜ ์ฆ‰์‹œ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์ผ ์ „๋ฐฉ์ˆœํšŒ๊ฐ€ ํ•„์š”ํ• ๋•Œ, ๋‘๋ฐฉํ–ฅ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋‚˜ ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
  • 29. 4.2 Matching Algorithms with Containers ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ผ€์ด๋ธ” ๊ฐœ๋…์œผ๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ์ƒ์ƒ์˜ ์ผ€์ด๋ธ” ์–‘๋์— ์ด›์ ์„ ๋งž์ถฐ๋ณด์ž. (์–‘๋์€ ์ฝ˜ํ…Œ์ด๋„ˆ์ธก๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธก์„ ์–˜๊ธฐํ•œ๋‹ค) 4.2.1 ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—ฐ๊ฒฐ (Plugging the cable into a Container) ๋งŒ์•ฝ ์Šค์Šค๋กœ ๊ธฐ๋ณธ STL ์ฝ˜ํ…Œ์ด๋„ˆ ๋ฒ”์œ„๋กœ๋งŒ ํ•œ์ •ํ•˜์—ฌ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹จ ๋‘๊ฐ€์ง€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์•„๋ž˜์˜ํ…Œ์ด๋ธ” 1.8์„ ๋ณด๋ฉด ๋ฒกํ„ฐ์™€ ํ๋Š” ์–ด๋–ค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“  ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ˜๋ฉด์— list, set, multiset, map, multimap์€ ๋žœ๋ค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋งŒ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ์ˆ˜ ์žˆ๋‹ค. Table 1.8 Iterator Types Accepted by Containers ======================================================================== vector List Deque Set Multiset Map Multimap ======================================================================== Random access x x ------------------------------------------------------------------------ Bidirectional x x x x x x x ------------------------------------------------------------------------ Forward x x x x x x x ------------------------------------------------------------------------ Output x x x x x x x ------------------------------------------------------------------------ input x x x x x x x ======================================================================== ๊ทธ๋ ‡๋‹ค๋ฉด STL์€ ์–ด๋–ป๊ฒŒ ์ฃผ์–ด์ง„ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์•Œ๋งž๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ• ๊ฒƒ์ธ์ง€๋ฅผ ๋ช…์‹œํ•ด์ค˜์•ผ๋งŒ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, intํ˜•์„ ์ˆ˜์šฉํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด, lint<int> iList; // list of ints ๋ผ๊ณ  ์„ ์–ธํ•˜๊ณ , ์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์ฒ˜๋Ÿผ ํ• ๊ฒƒ์ด๋‹ค. list<int>::iterator iter; // iterator to list-of-ints
  • 30. ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด, STL์€ ์ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ list์—๊ฒŒ ์š”๊ตฌ๋˜๋Š” bidirectional(์Œ๋ฐฉ) ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค. vector๋‚˜ deque์— ๋Œ€ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ž๋™์œผ๋กœ ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด ์ค„๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ž๋™์„ ํƒ ํ”„๋กœ์„ธ์Šค๋Š” ํŠน์ •ํ•œ ํด๋ž˜์Šค์— ์ ํ•ฉํ•˜๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ๋ณด๋‹ค ์ผ๋ฐ˜ํ™”๋œ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์† ๋ฐ›์€ ํŠน์ •ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•จ์œผ๋กœ์จ ๊ตฌํ˜„๋œ๋‹ค. ๋”ฐ๋ผ์„œ vector์™€ queue์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” random_access_iterator๋กœ๋ถ€ํ„ฐ ์ƒ์†์„ ๋ฐ›๊ณ , ๋ฐ˜๋ฉด์— list์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” bidirectional_iterator ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋œ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ์ฝ˜ํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค์–‘ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ(์ผ€์ด๋ธ”)์˜ ๋๊ณผ ์–ด๋–ป๊ฒŒ ๋งค์น˜๋˜๋Š”์ง€๋ฅผ ์‚ดํŽด๋ณด์ž. 4.2.2 ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์—ฐ๊ฒฐ (Plugging the Cables into th Algorithm) ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ํ•œ์ชฝ ๋์ด ์–ด๋–ป๊ฒŒ ์ฝ˜ํ…Œ์ด๋„ˆ์™€ ์—ฐ๊ฒฐ๋˜๋Š”์ง€๋ฅผ ์•ž์—์„œ ๋ดค์œผ๋‹ˆ๊นŒ ์ด์ œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๋‹ค๋ฅธ ํ•œ์ชฝ์„ ๋ณผ ์ฐจ๋ก€๋‹ค. ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋ ๊ฒƒ์ธ๊ฐ€? ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ๋“ค์—๊ฒŒ ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ ํ• ๊ฒƒ์ธ๊ฐ€์— ๋”ฐ๋ผ์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๊ฒŒ ๋œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ์— ๋Œ€ํ•ด ์ž„์˜์˜ ์œ„์น˜์—์„œ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋‹ค๋ฉด ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ๋˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋‹จ์ง€ ์ˆœ์ฐจ์  ์ „๋ฐฉ ์•ก์„ธ์Šค๋งŒ ์›ํ•œ๋‹ค๋ฉด ๋œ ํŒŒ์›Œํ’€ํ•œ forward ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ…Œ์ด๋ธ” 1.9๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ•„์š”๋กœํ•˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. Table 1.9 Type of Iterator Representative Algorithms ============================================================= Bidirec- Random Input Output Forward tional Access ============================================================= for_each x ------------------------------------------------------------- find x ------------------------------------------------------------- count x ------------------------------------------------------------- copy x x ------------------------------------------------------------- replace x ------------------------------------------------------------- unique x -------------------------------------------------------------
  • 31. reverse x ------------------------------------------------------------- sort x ------------------------------------------------------------- nth_element x ------------------------------------------------------------- merge x x ------------------------------------------------------------- accumulate x ============================================================= ๋น„๋ก ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด ์–ด๋–ค ํ•œ์ •์  ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ์š”๊ตฌํ•˜๋”๋ผ๊ณ  ์ด๋ณด๋‹ค ๋” ํŒŒ์›Œํ’€ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. replace() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ forward ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ bidirectional(์–‘๋ฐฉํ–ฅ) ์ด๋‚˜ random access ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค . ์ด์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด, ์ปดํ“จํ„ฐ์— ์žˆ๋Š” ์ผ€์ด๋ธ” ์ฝ”๋„ฅํ„ฐ์ฒ˜๋Ÿผ, ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•€์„ ๊ฐ€์ง„ ์ฝ”๋„ฅํ„ฐ๋ฅผ ๊ฐ€์กŒ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์ž. (๊ทธ๋ฆผ 1.4) ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๊ฒƒ์€ 5๊ฐœ์˜ ํ•€์„ ๊ฐ€์กŒ๊ณ , ์–‘๋ฐฉํ–ฅ(bidirectional) ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ 4๊ฐœ์˜ ํ•€์ด ์žˆ์œผ๋ฉฐ, ์ „๋ฐฉ(forward) ์ฐธ์กฐ๋ฅผ ์š”ํ•˜๋Š” ๊ฒƒ์€ 3๊ฐœ์˜ ํ•€์ด ์žˆ๋‹ค. Random_access container iterator Algorithm + ----------+ |() -| + ------------+ | vector | ----|() -|----| reverse() | + ----------+ |() OK -| + ------------+ |() -| |() bidirectional iterator + ----------+ |() -| + ------------+ | List |----|() -|----| sort() | + ----------+ |() No -| + ------------+ |() Good -| -| [๊ทธ๋ฆผ 1.4 ์ฝ˜ํ…Œ์ด๋„ˆ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ]
  • 32. ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์—ฐ๊ฒฐ๋  ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๋์€ ๋ช‡ ๊ฐœ์˜ ๊ตฌ๋ฉ์„ ๊ฐ€์ง„ ์ฝ”๋„ฅํ„ฐ๋ฅผ ๊ฐ€์ง„๋‹ค. 5๊ฐœ์˜ ๊ตฌ๋ฉ์„ ๊ฐ€์ง„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” 5๊ฐœ์˜ ํ•€์„ ๊ฐ€์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์—ฐ๊ฒฐ๋˜๊ณ , ๋˜ํ•œ 4๊ฐœ๋‚˜ ๊ทธ ์ดํ•˜์˜ ํ•€์„ ๊ฐ–๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋„ ์—ฐ๊ฒฐ๋  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ 4๊ฐœ์˜ ๊ตฌ๋ฉ์„ ๊ฐ€์ง€๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ (bidirectional)์™€ 5๊ฐœ์˜ ํ•€์ด ์žˆ๋Š” ๋žœ๋ค ์•ก์„ธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋Š” ์—ฐ๊ฒฐ ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” ๋ฒกํ„ฐ์™€ ๋ฐํ๋Š” bidirectional ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ง€๋‹ˆ๊ณ , ์–‘๋ฐฉํ–ฅ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ณด๋‹ค ๋œ ํŒŒ์›Œํ’€ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ๋ถ™์„ ์ˆ˜ ์žˆ๋‹ค. 4.3 The Tables Tell the Story ํ…Œ์ด๋ธ” 1.8๊ณผ 1.9๋กœ๋ถ€ํ„ฐ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ์™€ ์ž‘๋™๋˜๋Š”์ง€๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ํ…Œ์ด๋ธ” 1.9๋Š” sort() ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ…Œ์ด๋ธ” 1.8์„ ๋ณด๋ฉด ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ฒกํ„ฐ์™€ ๋ฐํ๋งŒ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด sort()์•Œ๊ณ ๋ฆฌ์ฆ˜์„ list, set, map๋“ฑ์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค์ด ๋žœ๋ค ์•ก์„ธ์Šค ๋ฐ”๋กœ ๋ฐ‘ ๋‹จ๊ณ„์˜ bidirectional ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”์—†๋Š” ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋“ ์ง€ ์•„๋ฌด STL ์ฝ˜ํ…Œ์ด๋„ˆ์™€ ์ž‘๋™์ด ๋œ๋‹ค. (STL์—์„œ singly-linked list๋Š” forward ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ reverse() ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.) 4.3.1 Overlapping Member Functions and Algorithms (๋ฉค๋ฒ„ํ•จ์ˆ˜์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ค‘์ฒฉ) ๋•Œ๋•Œ๋กœ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์—์„œ ์„ ํƒํ•ด์•ผํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. find()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ์ฝ˜ํ…Œ์ด๋„ˆ๋“  ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ set๊ณผ map์€ ์ž์‹ ๋งŒ์˜ find() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ณผ์—ฐ ์–ด๋–ค ๋ฒ„์ „์˜ find()๋ฅผ ์‚ฌ์šฉํ• ๊ฒƒ์ธ๊ฐ€? ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉค๋ฒ„ํ•จ์ˆ˜ ๋ฒ„์ „์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ทธ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋น„ ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—” ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 4.4 Iterators at Work ์ง€๊ธˆ๊นŒ์ง€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ๋ณต์žกํ•˜๊ฒŒ ๋– ๋“ค์—ˆ์ง€๋งŒ, ๋ฐฑ๋ฌธ์ด๋ถˆ์—ฌ์ผ๊ฒฌ! ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ์˜์™ธ๋กœ ๊ฐ„๋‹จํ•˜๋‹ค. ์ด๋ฏธ ์•ž์—์„œ ๋ช‡๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์•˜๋“ฏ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ค์€ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ begin(), end()๊ฐ€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ฒŒ๋œ๋‹ค. ์—ฌํƒœ๊นŒ์ง€ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์ด ๋ฆฌํ„ดํ•˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ’์ด ํฌ์ธํ„ฐ๋กœ๋งŒ ์ทจ๊ธ‰๋œ๋‹ค๊ณ  ๋งํ•ด์—ˆ์ง€๋งŒ, ์ด์   ์ด๋Ÿฌํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ค์ด ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์‹คํ•˜๊ฒŒ ์‚ดํŽด๋ณด์ž. 4.4.1 Data Access ๋žœ๋ค ์•ก์„ธ์Šค ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š”(vector, deque) ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ๋Š” [] ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฐธ์กฐํ–ˆ๋‹ค. ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” list ๊ฐ™์€ ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ์ด๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์˜ ์ฐธ์กฐ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค. ์•ž์—์„œ ๋“ค์—ˆ๋˜ ์˜ˆ ์ค‘์— ์•„์ดํ…œ์„ ํ•˜๋‚˜์”ฉ pop ํ•ด์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋‚ด์šฉ์„ displayํ•˜๊ธฐ์œ„ํ•ด "LIST"์™€ "LISTPLUS" ์˜ˆ์ œ์—์„œ destructive readout์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.
  • 33. ์ด๊ฑธ ์ข€๋” ์‹ฌํ™”ํ•˜์—ฌ ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ •์˜๋œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž. // listout.cpp // iterator and for loop for output #include <iostream> #include <list> #include <algorithm> using namespace std; int main() { int arr[] = {2, 4, 6, 8 }; list<int> theList; for (int k=0; k<4; k+ +) // ๋ฐฐ์—ด์˜ ์—˜๋ฆฌ๋จผํŠธ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฑ„์šด๋‹ค. theList.push_back(arr[k]); list<int>::iterator iter; // iterator to list-of-ints for (iter=theList.begin(); iter != theList.end(); iter+ +) cout << *iter << ' '; // display the list cout << endl; return 0; } ์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋‹จ์ˆœํžˆ theList ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ณผ๋Š” 2 4 6 8 ์ด๋‹ค. ์œ„์—์„œ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ํƒ€์ž…๊ณผ ๋งค์น˜์‹œํ‚ค๊ธฐ์œ„ํ•ด list<int>ํƒ€์ž…์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์„ ์–ธํ–ˆ๋‹ค. ๋งˆ์น˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋“ฏ์ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. for ๋ฃจํ”„์—์„œ iter = theList.begin() ๊ตฌ๋ฌธ์œผ๋กœ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ๋ถ€๋ถ„์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค. ++์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ํฌ์ธํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ *์˜คํผ๋ ˆ์ดํ„ฐ๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ’์„ ์—ญ์ฐธ์กฐํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฃจํ”„์˜ ์ข…๋ฃŒ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋์— ๋‹ค๋‹ค๋ž๋‚˜๋ฅผ ์ฒดํฌํ•จ์œผ๋กœ์จ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค. ๋˜ํ•œ for ๋ฃจํ”„์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ while ๋ฃจํ”„๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • 34. iter = theList.begin(); while ( iter != theList.end() ) cout << *iter+ + << ' '; *iter+ + ๋ฌธ๋ฒ•์€ ํฌ์ธํ„ฐ์™€ ๊ฐ™๋‹ค. 4.4.2 Data Insertion ์•„๋ž˜์˜ LISTFILL ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ณณ์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž. // listfill.cpp // uses iterator to fill list with data #include <iostream> #include <list> using namespace std; int main() { list<int> iList(5); // empty list holds 5 ints list<int>::iterator it; // iterator int data = 0; // fill list with data for (it=iList.begin(); it != iList.end(); it+ +) *it = data + = 2; // display the list for (it=iList.begin(); it != iList.end(); it+ +) cout << *it << ' '; cout << endl; return 0; } ์ฒซ๋ฒˆ์งธ for ๋ฃจํ”„๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— int ๊ฐ’์€ 2, 4, 6, 8, 10์œผ๋กœ ์ฑ„์šด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ for ๋ฃจํ”„๋Š” ์ด ๊ฐ’๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค.
  • 35. 4.4.3 Algorithms and Iterators ์šฐ๋ฆฌ๊ฐ€ ์–˜๊ธฐํ–ˆ๋˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ธ์ž๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋•Œ๋ก  ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ITERFIND ์˜ˆ์ œ๋Š” find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฆฌ์ŠคํŠธ์— ์ ์šฉ๋˜๋Š” ๊ฑธ ๋ณด์—ฌ์ค€๋‹ค. (์ด๋ฏธ ์•Œ๊ณ ์žˆ๊ฒ ์ง€๋งŒ find()์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์˜ค์ง input ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋งŒ ํ•„์š”ํ•˜๊ธฐ๋•Œ๋ฌธ์— list์™€ ํ•จ๊ป˜ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค.) // ITERFIND.cpp // find() returns a list iterator #include <iostream> #include <list> #include <algorithm> using namespace std; int main() { list<int> iList (5); // empty list holds 5 ints list<int>::iterator it; // iterator int data = 0; // fill list with data for (it=iList.begin(); it != iList.end(); it+ +) *it = data + 2; // 2, 4, 6, 8, 10 it = find (iList.begin(), iList.end(), 8); if (it != iList.end()) cout << "nFound 8.n"; else cout << "nDid not find 8.n"; return 0; } find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 3๊ฐœ์˜ ์ธ์ž๋ฅผ ์ทจํ•œ๋‹ค. ์ฒซ๋ฒˆ์งธ์™€ ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ๊ฒ€์ƒ‰๋  ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ์ด๊ณ , ์„ธ๋ฒˆ์งธ ์ธ์ž๋Š” ์ฐพ์„ ๊ฐ’์ด๋‹ค. find()๊ฐ€ iList.end()๋ฅผ ๋ฆฌํ„ดํ–ˆ๋‹ค๋ฉด ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ๋์— ๋„๋‹ฌํ•œ ๊ฒƒ์ด๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ๊ฐ’์ด ์žˆ๋Š” ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์œ„์˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. Found 8.
  • 36. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฒ€์ƒ‰ํ•œ ๊ฐ’ 8์ด ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ ๋ช‡๋ฒˆ์งธ ์œ„์น˜์— ์žˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ์ˆ˜ ์žˆ์„๊นŒ? ์•„๋งˆ๋„ ์ผ์น˜๋˜๋Š” ์•„์ดํ…œ์˜ offset์—์„œ ์‹œ์ž‘ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋นผ์ฃผ๋ฉด ๋ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ๊ฒƒ์ด๋‹ค. (it - iList.begin()). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฆฌ์ŠคํŠธ์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ์‚ฌ์šฉ๋œ ์˜ฌ๋ฐ”๋ฅธ ์˜คํผ๋ ˆ์ด์…˜์ด ์•„๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋‹จ์ง€ bidirectional ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— ์‚ฐ์ˆ  ์˜คํผ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ณ  ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์ง€์›ํ•˜๋Š” vector๋‚˜ deque์—์„œ๋‚˜ ์‚ฐ์ˆ  ์˜คํผ๋ ˆ์ด์…˜์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ iList๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฒกํ„ฐ v๋ผ๋ฉด ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์จ์„œ ๊ฒ€์ƒ‰ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. it = find (v.begin(), v.end(), 8); if (it != v.end()) cout << "nFound 8 at location " << (it - v.begin()); else cout << "nDid not find 8."; ์œ„์˜ ๊ฒฐ๊ณผ๋Š” Found 8 at location 3 ์ด ๋  ๊ฒƒ์ด๋‹ค. ์ธ์ž๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋‹ค๋ฅธ ์˜ˆ์ œ๋ฅผ ๋ณด์ž. vector๋ฅผ copy() ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‹ค๋ฅธ vector๋กœ ๋ณต์‚ฌ ํ•˜๋Š”๋ฐ ์ธ์ž๋กœ ๋ณต์‚ฌ์›๋ณธ์˜ ๋ฒ”์œ„์™€ ๋ชฉ์  ์ฝ˜ํ…Œ์ด๋„ˆ๋ฅผ ์ ์–ด์ค€๋‹ค. // itercopy.cpp // uses iterators for copy() algorithm #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int beginRange, endRange; int arr[] = { 11,13,15,17,19,21,23,25,27,29}; vector<int> v1 (arr, arr+ 10); // ๋ฒกํ„ฐ ์ดˆ๊ธฐํ™” vector<int> v2 (10); // ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฒกํ„ฐ cout << "Enter range to be copied (example: 2 5) "; cin >> beginRange >> endRange;
  • 37. vector<int>::iterator iter1 = v1.begin() + beginRange; vector<int>::iterator iter2 = v1.begin() + endRange; vector<int>::iterator iter3; // copy from v1 to v2 iter3 = copy (iter1, iter2, v2.begin()); // iter3์—๋Š” ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ์ด ๋ณต์‚ฌ๋œ๋‹ค. iter1 = v2.begin(); while (iter1 != iter3) cout << *iter1++ << ' '; cout << endl; return 0; } ๋ฒ”์œ„๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๊ฒฐ๊ณผ๋Š” Enter range to be copied (example: 2 5): 3 6 17 19 21 ์ด ๋  ๊ฒƒ์ด๋‹ค. v2์˜ ๋ชจ๋“  ์•„์ดํ…œ์„ ๋ณด์—ฌ์ค„ ํ•„์š”์—†์ด ๋ณต์‚ฌ๋œ ๊ฒƒ๋งŒ ๋ณด์—ฌ์ฃผ๋ฉด ๋œ๋‹ค. ๋‹คํ–‰ํžˆ๋„ copy() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ณต์‚ฌ๋  ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋งˆ์ง€๋ง‰ ํฌ์ธํ„ฐ(์ดํ„ฐ๋ ˆ์ดํ„ฐ)๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์€ ์ด ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋ณต์‚ฌ๋œ ๊ฐ’๋“ค์„ displayํ•˜๊ฒŒ ํ–ˆ๋‹ค. 4.5 Speialized Iterators ์ด๋ฒˆ ์žฅ์—์„œ๋Š” ํŠน๋ณ„ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ˜•ํƒœ 2๊ฐ€์ง€๋ฅผ ์‚ดํŽด๋ณธ๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” ํฅ๋ฏธ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ์ž‘๋™์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์–ด๋Žํ„ฐ์™€ ๋งˆ์น˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ํ—ˆ์šฉํ•˜๋Š” ์ŠคํŠธ๋ฆผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ค์ด๋‹ค. 4.5.1 Iterator Adapters STL์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋ณดํ†ต 3๊ฐœ์˜ ๋ณ€์ข…์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฐ๊ฒƒ๋“ค์—๋Š” reverse iterator, insert iterator, raw storage iterator๊ฐ€ ์žˆ๋‹ค. reverse iterator๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋‚ด์šฉ์„ ์—ญ์ˆœ์œผ๋กœ ์ฐธ์กฐํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ณ , insert iterator๋Š” copy()๋‚˜ merge()๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝ์‹œํ‚ค๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ณณ์— ๋ฎ์–ด์“ฐ๊ฒŒ ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ raw storage iterator๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, raw storage iterator๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ๋‚ด์šฉ์€ ๋‹ค๋ฃจ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
  • 38. 4.5.1.1 Reverse Iterators ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋์—์„œ ๋ถ€ํ„ฐ ์—ญ์ˆœ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์–ธ๋œป ์ƒ๊ฐํ•˜๊ธฐ์— ๋‹ค์Œ์ฒ˜๋Ÿผ ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋‹ค. list<int>::iterator iter; iter = iList.end(); while ( ier != iList.begin() ) cout << *iter-- << ' '; ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์œ„์˜ ์ฝ”๋“œ๋Š” ๋Œ์•„๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ์ด์œ ๋Š” ๋‹จ ํ•œ๊ฐ€์ง€, ๋ฒ”์œ„๊ฐ€ ํ‹€๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (n-1 ๋ถ€ํ„ฐ 0๊นŒ์ง€ ์—ฌ์•ผ ๋˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ๋Š” n ๋ถ€ํ„ฐ 0๊นŒ์ง€ ๊ฐ€ ๋œ๋‹ค) ์—ญ์ˆœ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ์„๋•Œ๋Š” reverse iterator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ITEREV ํ”„๋กœ๊ทธ๋žจ์€ ์—ญ์ˆœ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด reverse iterator๊ฐ€ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. // iterev.cpp // demonstrates reverse iterator #include <iostream> #include <list> using namespace std; int main() { int arr[] = {2, 4, 6, 8, 10}; list <int> theList; for (int j=0; j<5; j+ +) theList.push_back( arr[j] ); list< int>::reverse_iterator revit; revit = theList.rbegin(); while (revit != theList.rend() ) cout << *revit++ << ' '; cout << endl; return 0; } ์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” 10 8 6 4 2
  • 39. ๊ฐ€ ๋œ๋‹ค. reverse iterator๋ฅผ ์‚ฌ์šฉํ• ๋•Œ rbegin()๊ณผ rend()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์ด๊ฑธ๋กœ ์ •์ƒ์  ์ˆœ์„œ๋กœ๋œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ์ ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. -_-;) ๋‹นํ™ฉ์Šค๋Ÿฝ๊ฒ ์ง€๋งŒ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” rbegin()์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ  ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ --ํ•˜์ง€ ๋ง๊ณ  + +ํ•ด์•ผ ํ•œ๋‹ค. reverse iterator๋Š” ํ•ญ์ƒ rbegin()์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  rend()๋กœ ๋๋‚˜๊ณ , ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ฆ๊ฐ€ ์‹œ์ผœ์•ผํ•œ๋‹ค. 4.5.1.2 Insert Iterators copy() ๊ฐ™์€ ์ผ๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์กด์žฌํ•˜๋Š” ๋‚ด์šฉ์œ„์— ๋ฎ์–ด์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. COPYDEQ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค๋ฅธ ๋ฐํ๋กœ ๋ณต์‚ฌํ•˜๋Š” ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. // copydeq.cpp // demonstrates normal copy with deques #include <iostream> #include <deque> #include <algorithm> using namespace std; int main() { int arr1[] = {1, 3, 5, 7, 9}; int arr2[] = {2, 4, 6, 8, 10}; deque <int> d1; deque <int> d2; for (int j=0; j<5; j+ +) { d1.push_back( arr1[j] ); d2.push_back( arr2[j] ); } // d1 ์„ d2๋กœ ๋ณต์‚ฌํ•œ๋‹ค. copy(d1.begin(), d1.end(), d2.begin()); for (int k=0; k<d2.size(); k+ +) cout << d2[k] << ' '; cout << endl; return 0; } ์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” 1 3 5 7 9 ๊ฐ€ ๋œ๋‹ค.
  • 40. d2๋ฅผ ๋“ค์—ฌ๋‹ค ๋ณด๋ฉด d2๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋‚ด์šฉ๋“ค์ด d1์˜ ๊ฒป๋“ค๋กœ ๋ฎ์–ด ์“ฐ์—ฌ์ง„ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ๋™์ž‘์€ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” copy() ๋ณด๋‹ค๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„๋•Œ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋•Œ๋Š” insert ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ด๊ฒƒ์˜ ์„ธ๊ฐ€์ง€ ๋ณ€์ข…์„ ๋ณด์ž โ— back_inserter: ๋’ค์—๋‹ค new ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋„ฃ๋Š”๋‹ค. โ— front_inserter: ์•ž์—๋‹ค new ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋„ฃ๋Š”๋‹ค. โ— inserter : new ์•„์ดํ…œ์„ ์›ํ•˜๋Š” ์œ„์น˜์— ๋„ฃ๋Š”๋‹ค. DINSITER ํ”„๋กœ๊ทธ๋žจ์€ back_inserter ์˜ ์‚ฌ์šฉ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. // dinsiter.cpp // demonstrates insert iterators with queues #include <iostream> #include <deque> #include <algorithm> using namespace std; int main() { int arr1[] = {1, 3, 5, 7, 9}; int arr2[] = {2, 4, 6,}; deque <int> d1; deque <int> d2; for (int i=0; i<5; i+ +) d1.push_back( arr1[i] ); for (int j=0; j<3; j+ +) d2.push_back( arr2[j] ); // d1์„ d2๋กœ ๋ณต์‚ฌํ•˜๋Š”๋ฐ ์ˆœ์„œ๋Š” ์—ญ์ˆœ์ด๋œ๋‹ค. copy (d1.begin(), d1.end(), back_inserter(d2)); cout << "nd2: "; for (int k=0; k<d2.size(); k+ +) cout << d2[k] << ' '; cout << endl; return 0; }
  • 41. ํƒ€๊ฒŸ ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋’ค์—๋‹ค๊ฐ€ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด back_iterator๋Š” push_back() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ณ  ์†Œ์Šค ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๋‚ด์šฉ์€ ๋ณ€ํ•จ์ด ์—†๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” ์›๋ž˜ d2์˜ ๋‚ด์šฉ์— d1์˜ ๋‚ด์šฉ์ด ์ถ”๊ฐ€๋œ 2 4 6 1 3 5 7 9 ๊ฐ€ ๋œ๋‹ค. ๋งŒ์ผ front_inserter ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด copy (d1.begin(), d1.end(), front_inserter (d2)); push_front() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์•ž์—์„œ๋ถ€ํ„ฐ ์‚ฝ์ž…ํ•ด๋‚˜๊ฐ„๋‹ค. ๊ฒฐ๊ณผ: 9 7 5 3 1 2 4 6 ๋˜ํ•œ ์ž„์˜์˜ ์œ„์น˜์— new ์•„์ดํ…œ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜๋Š” d2์˜ ์ฒ˜์Œ์— d1์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. copy (d1.begin(), d1.end(), inserter(d2, d2.begin())); ๊ฒฐ๊ณผ: 1 3 5 7 9 2 4 6 ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ inserter์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” vector์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด์œ ๋Š” vector์—๋Š” push_front() ๋ฉ”์˜๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐฑํ„ฐ๋Š” ๋ฌด์กฐ๊ฑด ๋์—์„œ๋ถ€ํ„ฐ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 4.5.1.3 Stream Iterators ์ŠคํŠธ๋ฆผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ํ™”์ผ๊ณผ I/O ๋””๋ฐ”์ด์Šค(cin์ด๋‚˜ cout)๋ฅผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ๋‹ค๋ฃฐ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ธ์ž๋กœ ํŒŒ์ผ๊ณผ IO ๋””๋ฐ”์ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. input๊ณผ output์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ์ฃผ๋ชฉ์ ์ด ์ด๋Ÿฌํ•œ ์ŠคํŠธ๋ฆผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜๋Š”๊ฒƒ์ด๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ง์ ‘ input๊ณผ output์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ์‚ฌ์‹ค ์ŠคํŠธ๋ฆผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ input์ด๋‚˜ output์„ ํ…œํ”Œ๋ฆฟํ™”ํ•œ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘๊ฐ€์ง€์˜ ์ŠคํŠธ๋ฆผ์ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ ostream_iterator์™€ istream_iterator์ด๋‹ค.
  • 42. 4.5.1.3.1 The ostream_iterator Class ostream_iterator ์˜ค๋ธŒ์ ํŠธ๋Š” ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ์ธ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. // outiter.cpp // demonstrates ostream_iterator #include <iostream> #include <algorithm> #include <list> using namespace std; int main() { int arr [] = { 10, 20, 30, 40, 50 }; list <int> theList; for (int j=0; j<5; j+ +) theList.push_back (arr[j]); ostream_iterator<int> ositer(cout, ","); // ostream iterator cout << "nContents of list: "; copy (theList.begin(), theList.end(), ositer); // display list cout << endl; return 0; } ์—ฌ๊ธฐ์„œ๋Š” int ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด ostream iterator๋ฅผ ์ •์˜ํ–ˆ๋‹ค. ์ƒ์„ฑ์ž์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” int ๊ฐ’์ด ์”Œ์–ด์งˆ stream value์ด๊ณ , ๋‘๋ฒˆ์งธ ์ธ์ž ๋ฌธ์ž์—ด์€ ๊ฐ ๊ฐ’๋งˆ๋‹ค ๋ซ๋ถ™๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ stream value๋Š” ํ™”์ผ๋ช…์ด๋‚˜ cout์ด๋ฉด ๋œ๋‹ค. copy() ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฆฌ์ŠคํŠธ์˜ ๋‚ด์šฉ์„ cout์œผ๋กœ ๋ณต์‚ฌํ•˜๊ฒŒ๋œ๋‹ค. copy()์˜ ์„ธ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ๋ฐ”๋กœ ostream iterator๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์œ„์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Contents of list: 10, 20, 30, 40, 50,
  • 43. ๋‹ค์Œ ์˜ˆ์ œ FOUTITER๋Š” ostream iterator๋กœ ํ™”์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค. // outiter.cpp // demonstrates ostream_iterator with files #include <iostream> #include <algorithm> #include <list> using namespace std; int main() { int arr [] = { 11, 21, 31, 41, 51 }; list <int> theList; for (int j=0; j<5; j+ +) theList.push_back (arr[j]); ofstream outfile ("ITER.DAT"); // create file object ostream_iterator<int> ositer(outfile, " "); // ostream iterator cout << "nContents of list: "; copy (theList.begin(), theList.end(), ositer); // display list return 0; } ํ™”์ผ๊ณผ ์—ฐ๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ofstream์„ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ณ  ๋ฉ”๋ชจ์žฅ์œผ๋กœ ITER.DAT๋ฅผ ์—ด์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 11 21 31 41 51
  • 44. 4.5.1.3.2 The istream_iterator Class istream_iterator ์˜ค๋ธŒ์ ํŠธ๋Š” input iterator๋ฅผ ๊ฐ€์ง„ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋“ ์ง€ ์ธ์ž๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ INITER๋Š” ์ด๋Ÿฌํ•œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ copy() ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฒ˜์Œ 2๊ฐœ์˜ ์ธ์ž๋กœ ์‚ฌ์šฉ ๋˜๋Š” ๊ฑธ ๋ณด์—ฌ์ค€๋‹ค. // initer.cpp // demonstrates istream_iterator #include <iostream> #include <list> #include <algorithm> using namespace std; int main() { list<float> fList (5); // uninitialized list cout << "nEnter 5 floating-point numbers: "; istream_iterator <float> cin_iter(cin); // cin istream_iterator <float> end_of_stream; // eos //K:์ด๊ณณ์—์„œ cin_iter์— ๊ฐ’์„๋„ฃ๊ณ  ํ•˜๋‚˜์”ฉ EOS๊ฐ€ ๋ ๋•Œ๊นŒ์ง€ fList๋กœ ๊ณ„์† ๋ณต์‚ฌํ•œ๋‹ค. copy ( cin_iter, end_of_stream, fList.begin() ); cout << endl; ostream_iterator<float> ositer(cout, "--"); copy (fList.begin(), fList.end(), ositer); cout << endl; return 0; } ์œ„ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” Enter 5 floating-point numbers: 1.1 2.2 3.3 4.4 5.5 1.1--2.2--3.3--4.4--5.5--
  • 45. copy()์—์„œ ์ฃผ๋ชฉํ•  ์‚ฌํ•ญ์€, ๋ฐ์ดํ„ฐ๋ฅผ cin์—์„œ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋  ๋ฒ”์œ„์˜ ๋(end_of_stream)์„ ๋ช…์‹œ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. istream_iterator๋Š” cin_iter๋ผ๊ณ  ์„ ์–ธ๋œ cinํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด end_of_stream์€ ๋ฌด์—‡์ธ๊ฐ€? ์ธ์ž๊ฐ€ ์—†์ด ์ƒ์„ฑ๋œ end_of_stream์€ ์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ ํŠน๋ณ„ํ•œ ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค. ์ด๊ฒƒ์€ ํ•ญ์ƒ ์ŠคํŠธ๋ฆผ์˜ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” istream_iterator๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. user๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด์„œ ์–ด๋–ป๊ฒŒ end-of-stream์ž„์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ <ctrl><z>๋ฅผ ๋ˆŒ๋Ÿฌ ์ž…๋ ฅ์„ ์ข…๋ฃŒ์‹œํ‚ค๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„์—์„ , ๋ฌผ๋ก  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ๋งŽ๊ฒ ์ง€๋งŒ, ๋ฆฌ์ŠคํŠธ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ostream_iterator๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ FINITER๋Š” copy()์˜ ์ž…๋ ฅ์œผ๋กœ cin๋Œ€์‹  file์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋‹ค. // finiter.cpp // demonstrates istream_iterator with files #include <iostream> #include <list> #include <fstream> #include <algorithm> using namespace std; int main() { list<int> iList(5); ifstream infile ("ITER.DAT"); // create input file object // (ITER.DAT๋Š” ๋ฏธ๋ฆฌ ์ค€๋น„๋ฅผ ํ•ด์•ผ๊ฒ ์ฃ ) istream_iterator<int> file_iter(infile); // file istream_iterator<int> end_of_stream; // eos copy ( file_iter, end_of_stream, iList.begin() ); cout << endl; // dispaly iList ostream_iterator<int> ositer(cout, "--"); copy (iList.begin(), iList.end(), ositer); cout << endl; return 0; } FINITER์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 11--21--31--41--51โ€”
  • 46. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ™”์ผ๋กœ์จ ITER.DAT๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ifstream์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ์œ„์—์„œ cout๋Œ€์‹ ์— ofstream์„ ์ด์šฉํ•˜์—ฌ outfile๋กœ ๋Œ€์น˜ํ•ด์ฃผ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ํ™”์ผ๋กœ๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜๋‹ค๋ฅธ ์‘์šฉ์œผ๋กœ์จ iList์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ์œ„ํ•ด back_inserter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ iList๋งŒ๋“ค๊ณ  ์ถ”๊ฐ€ํ•ด ๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค. 5 Associative Containers ์ด์ œ๊นŒ์ง€ ๊ณ ์ •๋œ ์„ ํ˜• sequence์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” sequence ์ฝ˜ํ…Œ์ด๋„ˆ(vector, list, deque) ๋ฅผ ๋‹ค๋ฃจ์—ˆ์—ˆ๋‹ค. ์œ ์šฉํ•œ ๊ฒƒ๋“ค์ด์ง€๋งŒ, item์„ ์ฐพ๊ธฐ์œ„ํ•ด์„œ๋Š” ์ฝ˜ํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๋ชจ๋“  item๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•ด ๋‚˜๊ฐ์œผ๋กœ์จ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ˜๋ฉด์— associative ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ๋Š” item์ด ์ผ๋ จ์˜ ์—ฐ์†์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค. ์ข€๋” ๋ณต์žกํ•œ ์ •๋ ฌ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ฐพ๊ณ ์ž ํ•˜๋Š” item์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฐ์—ด๋ฒ•์€ hash table์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ์ ‘๊ทผ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ tree๊ตฌ์กฐ๋ฅผ ๋ˆ๋‹ค. ๋”ฐ๋ผ์„œ assoiative ์ฝ˜ํ…Œ์ด๋„ˆ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๊ฒ€์ƒ‰ ์†๋„์ด๋‹ค. ๊ฒ€์ƒ‰์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด๊ฐ™์€ single value๋กœ ํ‘œํ˜„๋˜๋Š” key๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด ํ‚ค๊ฐ’์€ ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ object์˜ ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๊ฑฐ๋‚˜, ์ „์ฒด object๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ๋„ ํ•œ๋‹ค. STL์—์„œ associative ์ฝ˜ํ…Œ์ด๋„ˆ์˜ 2๊ฐ€์ง€ ์ฃผ์š” ๋ถ„๋ฅ˜๋กœ set๊ณผ map์ด ์žˆ๋‹ค. set์€ key๋ฅผ ํฌํ•จํ•œ object๋ฅผ ์ €์žฅํ•œ๋‹ค. map์€ ๋‘๋ถ€๋ถ„์œผ๋กœ(pair) ๋‚˜๋ˆ„์–ด ์ €์žฅํ•˜๋Š”๋ฐ, ์ฒซ๋ฒˆ์งธ ๋ถ€๋ถ„์€ key๋ฅผ ํฌํ•จํ•œ object์ด๊ณ  ๋‘๋ฒˆ์งธ ๋ถ€๋ถ„์€ value๋ฅผ ํฌํ•จํ•˜๋Š” object์ด๋‹ค. set๊ณผ map์€ ๋ชจ๋‘, ๊ฐ ํ‚ค์— ๋Œ€ํ•ด์„œ ์˜ค์ง ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์ „์—์„œ ๊ฐ ๋‹จ์–ด์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์ด์ƒ์˜ ์—”ํŠธ๋ฆฌ๋ฅผ ๊ฐ–์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ STL์€ ๋‘๊ฐ€์ง€ ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ์œ„์˜ ์ œ์•ฝ์‚ฌํ•ญ์ด ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. multiset, multimap์€ set, map๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฐ™์€ ํ‚ค์—๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋‹ค. associtave ์ฝ˜ํ…Œ์ด๋„ˆ๋Š” ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค๊ณผ ๋งŽ์€ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋“ค์„ ๊ณต์œ ํ•˜์ง€๋งŒ, lower_bound()๋‚˜ equal_range() ๊ฐ™์€ ๋ช‡๋ช‡ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ associative ์ฝ˜ํ…Œ์ด๋„ˆ์—๋งŒ ์žˆ๋‹ค. 5.1 Sets and Multisets set์€ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ employees๊ฐ™์€ ์‚ฌ์šฉ์ž์ •์˜ ํด๋ž˜์Šค๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋˜ํ•œ set์€ string๊ฐ™์€ ๋‹จ์ˆœ object๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ๋„ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋ฆผ 5.5๋Š” set์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ชจ์–‘์ƒˆ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. object๋Š” ์ˆœ์„œ๋ฐ๋กœ ์ •๋ ฌ๋˜์–ด์ง€๊ณ , ๋ชจ๋‘ key๋ฅผ ๊ฐ€์ง„๋‹ค.
  • 47. set "puma" โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ "cat" โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ "dog" โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ "ocelot" โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ””โ”€โ”€โ”€โ”€โ”ผโ”€โ–ถ โ”‚ "puma" โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ "raindeer" โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ–ฒ โ”‚ โ””โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€ keys [๊ทธ๋ฆผ 5.5] A Set of string objects. // set.cpp // set stores string objects #include <iostream> #include <set> #pragma warning (disable: 4786) // for set (microsoft compilers only) #include <string> using namespace std;
  • 48. int main() { string names [] = { "Juanita", "Robert", "Marry", "Amanda", "Marie" }; set <string, less<string> > nameSet (names, names+ 5); set <string, less<string> >::iterator iter; nameSet.insert ("Yvette"); // insert more names nameSet.insert ("Larry"); nameSet.insert ("Robert"); // no effect; already in set nameSet.insert ("Barry"); nameSet.erase ("Marry"); // erase a name cout << "nSize=" << nameSet.size() << endl; iter = nameSet.begin(); while (iter != nameSet.end()) cout << *iter+ + << 'n'; string searchName; cout << "Enter name to search for: "; cin >> searchName; iter = nameSet.find (searchName); if ( iter == nameSet.end() ) cout << "The name " << searchName << " is NOT in the set."; else cout << "The name " << *iter << " IS in the set."; cout << endl; return 0; } set์„ ์„ ์–ธํ•  ๋•Œ, ์ €์žฅ๋  object(string)์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ  ๋ฉค๋ฒ„๋ฅผ ์ •๋ ฌํ•˜๊ธฐ์œ„ํ•ด function object์ธ less<> ()๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๋ณด์•„์˜จ STL์˜ ๋‹ค๋ฅธ ์ฝ˜ํ…Œ์ด๋„ˆ๋“ค๊ณผ ์œ ์‚ฌํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. array๋ฅผ ์ด์šฉํ•ด์„œ set์„ ์ดˆ๊ธฐํ™” ํ•˜๊ณ  insert() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐ˜๋ณต์ž(iterator)๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅ์„ ํ•œ๋‹ค. set์—์„œ ํŠน์ •ํ•œ ๊ฐ’์„ ์ฐพ๊ธฐ์œ„ํ•ด์„œ๋Š” find() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (sequential ์ฝ˜ํ…Œ์ด๋„ˆ์—์„œ๋Š” find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.)
  • 49. ๋‹ค์Œ์€ ์œ„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๊ณ  "George"๋ž€ ์ด๋ฆ„์„ ์ž…๋ ฅํ•œ ๊ฒฐ๊ณผ์ด๋‹ค. Size=7 Amanda Barry Juanita Larry Marie Robert Yvette Enter name to search for: George The name George is NOT in set. ๊ทธ๋Ÿผ ์ด์ œ associative ์ฝ˜ํ…Œ์ด๋„ˆ์—๋งŒ ์žˆ๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ๋‹ค์Œ์˜ ์˜ˆ์ œ๋Š” ์•ž์—์„œ ๋งํ•œ ์˜ˆ์ œ๋Š” lower_bound()์™€ upper_bound()์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค. // setrange.cpp // tests ranges within a set #include <iostream> #include <set> #pragma warning (disable: 4786) // for set (microsoft compilers only) #include <string> using namespace std; int main() { set <string, less<string> > organic; set <string, less<string> >::iterator iter; organic.insert ("Curine"); // insert organic compounds organic.insert ("Xanthine"); organic.insert ("Curarine"); organic.insert ("Melamine"); organic.insert ("Cyanimide"); organic.insert ("Phenol"); organic.insert ("Aphrodine"); organic.insert ("Imidazole"); organic.insert ("Cinchonie"); organic.insert ("Palmitamide");
  • 50. iter = organic.begin(); while ( iter != organic.end() ) cout << *iter+ + << 'n'; string lower, upper; cout << "nEnter range (example C Czz): "; cin >> lower >> upper; iter = organic.lower_bound (lower); while ( iter != organic.upper_bound (upper) ) cout << *iter+ + << 'n'; return 0; } ์ด ํ”„๋กœ๊ทธ๋žจ์€ ์ฒ˜์Œ์— ์กฐ์ง ๊ตฌ์„ฑ์›์„ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กฌํ”„ํŠธ์ƒ์—์„œ ์ž…๋ ฅ๋ฐ›์€ ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ถœ๋ ฅํ•œ๋‹ค. Aphrodine Cinchonie Curarine Curine Cyanimide Imidazole Melamine Palmitamide Phenol Xanthine Enter range (example C Czz): Aaa Curb Aphrodine Cinchonine Curarine lower_bound() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ํ‚ค๊ฐ’์„ ๋ฐ›๊ณ  ํ‚ค๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๊ฐ€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๋Š” ์ฒ˜์Œ ์—”ํŠธ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” iterator๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. upper_bound() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋Š” ์—ญ์‹œ ์ธ์ž๋กœ ํ‚ค๊ฐ’์„ ๋ฐ›๊ณ  ํ‚ค๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ–๋Š” ์ฒ˜์Œ ์—”ํŠธ๋ฆฌ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
  • 51. 5.2 Maps and Multimaps map์€ key ์˜ค๋ธŒ์ ํŠธ์™€ value์˜ค๋ธŒ์ ํŠธ์˜ ์Œ(pair)์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒƒ์„ ์ €์žฅํ•œ๋‹ค. key ์˜ค๋ธŒ์ ํŠธ๋Š” ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋  key๋ฅผ ํฌํ•จํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๊ณ , value ์˜ค๋ธŒ์ ํŠธ๋Š” ์ฒจ๋ถ€๋œ ๋ฐ์ดํ„ฐ์ด๋‹ค. key ์˜ค๋ธŒ์ ํŠธ๋Š” set์—์„œ ์ฒ˜๋Ÿผ strings, numbers, ๊ทธ๋ฆฌ๊ณ  ์ข€๋” ๋ณต์žกํ•œ ํด๋ž˜์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. value๋Š” ์ฃผ๋กœ strings ๋‚˜ numbers๊ฐ€ ๋˜์ง€๋งŒ ์ด๊ฒƒ ๋˜ํ•œ ๋ณต์žกํ•œ ํด๋ž˜์Šค์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ์–ด๋–ค ๋ฌธ์„œ๊ฐ€ ์žˆ์„๋•Œ, key๊ฐ€ word์ด๊ณ  value๋Š” ๋ฌธ์„œ์—์„œ ์ด ๋‹จ์–ด๊ฐ€ ์“ฐ์ธ ํšŸ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ map์€ ์ฃผ๋กœ ๋นˆ๋„ํ…Œ์ด๋ธ”(frequency table)์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋˜๋Š” key๋ฅผ ๋‹จ์–ด(word)๋กœ ํ•˜๊ณ  value๋ฅผ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ๋ฆฌ์ŠคํŠธ๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ฆผ 5.6์€ ์‚ฌ์ „์ฒ˜๋Ÿผ key๊ฐ€ ๋‹จ์–ด์ด๊ณ  value๊ฐ€ ์„ค๋ช…์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์„ ๋„์‹ํ™” ํ•œ๊ฒƒ์ด๋‹ค. "snail" โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ "cat" โ”œ "A small, furry animal โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ that chases mice." โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ "dog" โ”œ "A largre, hairy animal โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ that chases sticks." โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ””โ”€โ”€โ”€โ”€โ”ผโ”€โ–ถ โ”‚ "snail" โ”œ "A small, shelled animal โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ that eats gardends." โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ "puma" โ”œ "A large, furry animal โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ that eats hikers." โ”‚ โ”‚ โ–ฒ โ”‚ โ””โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€ key-value pairs [๊ทธ๋ฆผ 5.6] A map of word-phrase pairs.
  • 52. map์€ Associative Array๋กœ์จ ์‚ฌ์šฉ๋œ๋‹ค. C+ + ๋ฐฐ์—ด์—์„œ ํŠน์ • ๊ฐ’์„ ์ฐธ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋Š” integer์ด๋‹ค. ์ฆ‰ anArray[3] ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋œ๋‹ค. Associative Array์€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ํƒ€์ž…์„ ๋ง˜๋ฐ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด ์ด๋‹ค. ๋งŒ์•ฝ ์ธ๋ฑ์Šค ํƒ€์ž…์„ string์œผ๋กœ ํ–ˆ๋‹ค๋ฉด anArray ["jane"]์™€ ๊ฐ™์€ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 5.2.1 An Associative Array ์ด์ œ map์˜ ์˜ˆ์ œ๋กœ Associative Array๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ๋ณด์ž. key๋Š” ์–ด๋–ค ๋„์‹œ์˜ ์ด๋ฆ„์ด ๋˜๊ณ  value๋Š” ์ด ๋„์‹œ์˜ ์ธ๊ตฌ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. // asso_arr // demonstrates map used as associative array #include <iostream> #include <string> #include <map> #pragam warning (disable: 4786) // for map (Microsoft only) using namespace std; int main () { string name; int pop; string states [] = { "Wyoming", "Colorado", "Nevada", "Montana", "Arizona", "Idaho" }; int pops [] = {470, 2890, 800, 787, 2781, 944 }; map <string, int, less<string> > mapStates; map <string, int, less<string> >::iterator iter; for (int j=0; j<6; j+ +) { name = states[j]; pop = pops[j]; mapStates[name] = pop; // map์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. } cout << "Enter state: "; cin >> name; pop = mapStates[name]; // ์ธ๊ตฌ์ž๋ฃŒ๋ฅผ ์ฐพ๋Š”๋‹ค.
  • 53. cout << "Population: " << pop << ",000n"; cout << endl; for (iter = mapStates.begin(); iter != mapStates.end(); iter+ +) cout << (*iter).first << ' ' << (*iter).second << ",000n"; return 0; } ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๊ณ , ๋„์‹œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ map์—์„œ ์ž…๋ ฅํ•œ ๋„์‹œ๋ฅผ ํ‚ค๋กœ ํ•ด์„œ ์ธ๊ตฌ๋ฅผ ์ฐพ์•„ ๋‹ค์‹œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ฃผ๊ณ  ์ „์ฒด ์ž๋ฃŒ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. Enter state: Wyoming Population: 470,000 Arizona 2718,000 Colorado 2890,000 Idaho 944,000 Montana 787,000 Nevada 800,000 Wyoming 470,000 set์ด๋‚˜ map์˜ ๊ฒ€์ƒ‰ ์†๋„๋Š” ๋›ฐ์–ด๋‚˜๋‹ค. ์ด ์˜ˆ์ œ๋กœ ์†๋„๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€๋งŒ ์ˆ˜๋ฐฑ๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์‹œํ—˜ํ•ด๋ณด๋ฉด ๊ธˆ๋ฐฉ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ์˜ˆ์ œ์—์„œ ์ฃผ๋ชฉํ•  ๊ฒƒ์€ map์„ ์„ ์–ธํ• ๋•Œ ์„ธ๋ฒˆ์งธ๋กœ ๋“ค์–ด๊ฐ„ ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ค. map <string, int, less<string> > mapStates; ^^^^ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” key ์˜ค๋ธŒ์ ํŠธ์˜ ํƒ€์ž…์ด๊ณ , ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” value ์˜ค๋ธŒ์ ํŠธ์˜ ํƒ€์ž…์ด๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ธ๋ฒˆ์งธ ์ธ์ž๋Š” ํ‚ค๊ฐ€ ์ €์žฅ๋ ๋•Œ์˜ ์ •๋ ฌ๋ฐฉ์‹์„ ์ง€์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ๊ฐ€์ง€ ๋” ์ฃผ์˜ํ•  ๊ฒƒ์€ map์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. mapStates[name] = pop; ์œ„ ํ‘œํ˜„์€ C+ + ๋ฐฐ์—ด ํ‘œํ˜„์ฒ˜๋Ÿผ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ธ๋ฑ์Šค ํƒ€์ž…์€ string์ด๊ณ  ๋ฐฐ์—ดํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.
  • 54. ๋ฐ˜๋Œ€๋กœ ๊ฐ’์„ ์ฐธ์กฐํ• ๋•Œ๋Š” ์•„๋ž˜ ์ฒ˜๋Ÿผ ํ•œ๋‹ค. pop = mapStates[name]; ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต์ž(iterator)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” (*iter).first๊ฐ€ key์˜ค๋ธŒ์ ํŠธ์ด๊ณ  (*iter).second๊ฐ€ value ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. 6. Storing User-Defined Objects ์ด์ œ๊นŒ์ง€ ์–ธ๊ธ‰๋œ ์˜ˆ์ œ๋“ค์€ ๊ธฐ๋ณธํƒ€์ž…์œผ๋กœ ์กด์žฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋งŒ ๋‹ค๋ฃจ์—ˆ์ง€๋งŒ STL์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ ํด๋ž˜์Šค๋กœ๋„ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ์–ด๋ณธ๋‹ค. 6.1 A Set of person Objects ์ด๋ฆ„, ์„ฑ, ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๋Š” person ํด๋ž˜์Šค๋กœ ์‹œ์ž‘ํ•ด๋ณด์ž. ์ด ํด๋ž˜์Šค๋ฅผ set์— ์ €์žฅ์‹œ์ผœ ์ „ํ™”๋ฒˆํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ฒƒ์ด๋‹ค. // setpers.cpp // uses a multiset to hold person objects #include <iostream> #include <set> #pragma warning (disable:4786) // for set (Microsoft only) #include <string> using namespace std; class person { private: string lastName; string firstName; long phoneNumber; public: person () : lastName ("blank"), firstName ("blank"), phoneNumber (0) { } person (string lana, string fina, long pho) : lastName(lana), firstName (fina), phoneNumber (pho) { }
  • 55. friend bool operator< (const person&, const person&); friend bool operator== (const person&, const person&); void display () const { // display person's data cout << endl << lastName << ",t" << firstName << "ttphone: " << phoneNumber; } }; bool operator < (const person& p1, const person& p2) { if (p1.lastName == p2.lastName) return (p1.firstName < p2.firstName) ? true : false; return (p1.lastName < p2.lastName) ? true : false; } bool operator== (const person& p1, const person& p2) { if (p1.lastName == p2.lastName && p1.firstName == p2.firstName) return true; else return false; } ////////////////////////////////////////////////////////////////////////// int main () { // person ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ person pers1 ("Deauville", "William", 8435150); person pers2 ("McDonald", "Stacey", 3327536); person pers3 ("Bartoski", "Peter", 6946473); person pers4 ("KuangThu", "Bruce", 4157300); person pers5 ("Wellington", "Jhon", 9207400); person pers6 ("McDonald", "Amanda", 8435150); person pers7 ("Fredericks", "Roger", 7049982); person pers8 ("McDonald", "Stacey", 7764987); multiset < person, less<person> > persSet; // person๋“ค์˜ multiset multiset < person, less<person> >::iterator iter; // iterator
  • 56. // multiset์— person ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. persSet.insert (pers1); persSet.insert (pers2); persSet.insert (pers3); persSet.insert (pers4); persSet.insert (pers5); persSet.insert (pers6); persSet.insert (pers7); persSet.insert (pers8); cout << "nNumber of entries = " << persSet.size(); // multiset์˜ content๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. iter = persSet.begin(); while (iter != persSet.end()) (*iter+ +).display(); // lastName๊ณผ firstName์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. string searchLastName, searchFirstName; cout << "nnEnter last name of person to search for: "; cin >> searchLastName; cout << "Enter first name: "; cin >> searchFirstName; // ์ž…๋ ฅ๋ฐ›์€ ์ด๋ฆ„์œผ๋กœ searchPerson ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. person searchPerson (searchLastName, searchFirstName, 0); // ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด ๋ช‡๋ช…์ธ๊ฐ€ ์„ธ์–ด๋ณธ๋‹ค. int cntPersons = persSet.count (searchPerson); cout << "Number of persons with this name = " << cntPersons; // ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•œ๋‹ค. iter = persSet.lower_bound (searchPerson); while ( iter != persSet.upper_bound (searchPerson) ) (*iter+ +).display (); cout << endl; return 0; }
  • 57. person ํด๋ž˜์Šค๊ฐ€ STL ์ฝ˜ํ…Œ์ด๋„ˆ๋กœ ์ž‘๋™๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡๊ฐ€์ง€ ๊ณตํ†ต์œผ๋กœ ์“ฐ์ด๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ฐ”๋กœ ๊ธฐ๋ณธ์ƒ์„ฑ์ž, < ์˜คํผ๋ ˆ์ดํ„ฐ, == ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๋ฉค๋ฒ„ํ•จ์ˆ˜๋“ค์€ ๋ฆฌ์ŠคํŠธ ํด๋ž˜์Šค์™€ ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค. ๋˜ํ•œ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜คํผ๋ ˆ์ดํ„ฐ < ์™€ == ๋Š” const ์ธ์ž์ด์–ด์•ผ ํ•˜๊ณ  friend๋กœ ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค (๋ฉค๋ฒ„ํ•จ์ˆ˜๋กœ ํ•ด๋„ ์ƒ๊ด€์€ ์—†๋‹ค). ์˜ค๋ฒ„๋กœ๋“œ๋œ < ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” set์— ์ €์žฅ๋ ๋•Œ ์ •๋ ฌ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์˜ˆ์ œ setpers์—์„œ๋Š” last name์„ ์ •๋ ฌํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ๊ณ , last name์ด ๋™์ผํ•˜๋ฉด first name์œผ๋กœ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ์œ„ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. Number of entries = 8 Bartoski, Peter phone: 6946473 Deauville, William phone: 8435150 Fredericks, Roger phone: 7049982 KuangThu, Bruce phone: 4157300 McDonald, Amanda phone: 8435150 McDonald, Stacey phone: 3327536 McDonald, Stacey phone: 7764987 Wellington, Jhon phone: 9207400 Enter last name of person to search for: McDonald Enter first name: Stacey Number of persons with name = 2 McDonald, Stacey phone: 3327536 McDonald, Stacey phone: 7764987 (K:VC++6.0์—์„œ ์œ„์˜ ์†Œ์Šค๋Š” friendํ•จ์ˆ˜๊ฐ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋Œ€์š” ์•Œ์•„๋ณด๋‹ˆ๊นŒ VC+ +์˜ ๋ฒ„๊ทธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์„œ๋น„์ŠคํŒฉ 5๋ฅผ ๊นŒ์‹œ๊ฑฐ๋‚˜ .NET์„ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. SP5๋Š” 2003/4 ํ˜„์žฌ ์•„๋ž˜ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ๋ฐ›์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. http://www.microsoft.com/downloads/details.aspx?FamilyID=9066d31d -ba23-4e8a-b7c8- b95f5e54f896&DisplayLang=ko#filelist)
  • 58. 6.2 A List of person Objects ์œ„์˜ SETPERS ์˜ˆ์ œ์—์„œ, set์ด๋‚˜ multimap์œผ๋กœ ์ฃผ์–ด์ง„ ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฅด๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ, person ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ์ œํ•˜๊ธฐ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค๋ฉด list์˜ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค. // listpers.cpp // uses a list to hold person objects #include <iostream> #include <list> #include <algorithm> #include <string> using namespace std; class person { private: string lastName; string firstName; long phoneNumber; public: person () : lastName ("blank"), firstName ("blank"), phoneNumber (0L) { } person (string lana, string fina, long pho) : lastName (lana), firstName (fina), phoneNumber (pho) { } friend bool operator < (const person&, const person&); friend bool operator == (const person&, const person&); friend bool operator != (const person&, const person&); friend bool operator > (const person&, const person&); void display () const { // display person's data cout << endl << lastName << ",t" << firstName << "ttphone: " << phoneNumber; } long get_phone () const { return phoneNumber; } };
  • 59. bool operator < (const person& p1, const person& p2) { if (p1.lastName == p2.lastName) return (p1.firstName < p2.firstName) ? true : false; return (p1.lastName < p2.lastName) ? true : false; } bool operator == (const person& p1, const person& p2) { if (p1.lastName == p2.lastName && p1.firstName == p2.firstName) return true; return false; } bool operator != (const person& p1, const person& p2) { return !(p1 == p2); } bool operator > (const person& p1, const person& p2) { return !(p1 < p2) && !(p1 == p2); } int main () { list <person> persList; // list of person list <person>::iterator iter1; // iterator to a list of persons // put persons in list persList.push_back (person("Deauville", "William", 8435150)); persList.push_back (person("McDonald", "Stacey", 3327536)); persList.push_back (person("Bartoski", "Peter", 6946473)); persList.push_back (person("KuangThu", "Bruce", 4157300)); persList.push_back (person("Wellington", "Jhon", 9207400)); persList.push_back (person("McDonald", "Amanda", 8435150)); persList.push_back (person("Fredericks", "Roger", 7049982));
  • 60. persList.push_back (person("McDonald", "Stacey", 7764987)); cout << "nNumber of entries = " << persList.size(); iter1 = persList.begin (); // display contents of list while ( iter1 != persList.end() ) (*iter1++).display(); // find person or person with specified name (last and first) string searchLastName, searchFirstName; cout << "nnEnter last name of person to search for: "; cin >> searchLastName; cout << "Enter first name: "; cin >> searchFirstName; // make a person with that name person searchPerson (searchLastName, searchFirstName, 0L); // search for first match of names iter1 = find (persList.begin(), persList.end(), searchPerson); // find additional matches if ( iter1 != persList.end() ) { cout << "Person(s) with that name is(are)"; do { (*iter1).display (); // display match + +iter1; // search again, one past match iter1 = find (iter1, persList.end(), searchPerson); } while (iter1 != persList.end()); } else cout << "There is no person with that name."; // find person or persons with specified phone number cout << "nnEnter phone number (format 12345678): "; long sNumber; // get search number cin >> sNumber;
  • 61. // iterate through list bool found_one = false; for (iter1=persList.begin(); iter1!=persList.end(); iter1++) { if (sNumber == (*iter1).get_phone()) { // compare numbers if (!found_one) { cout << "Person(s) with that phone number is(are)"; found_one = true; } (*iter1).display(); } } if (!found_one) cout << "There is no person with that phone number"; cout << endl; return 0; } ////////////////////////////////////////////////////////////////////////// ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ํ• ๋•Œ: ์œ„์˜ ์˜ˆ์ œ๋Š” list๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋•Œ๋ฌธ์— lower_bound()/upper_bound() ๋ฉค๋ฒ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋Œ€์‹ ์— ๊ฒ€์ƒ‰์„ ํ•˜๊ธฐ์œ„ํ•ด find() ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ list์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ๋น„๊ตํ•˜๊ฒŒ๋œ๋‹ค. ์šฐ์„  ์ตœ์ดˆ๊ฒ€์ƒ‰์„ ํ•˜๊ณ , ๋ฐœ๊ฒฌ๋˜๋ฉด ๊ทธ ๋‹ค์Œ ์œ„์น˜๋ถ€ํ„ฐ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ๊ณ„์† ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰ find()๋ฅผ ๋‘๋ฒˆ ์จ์•ผํ•œ๋‹ค. Phone Number๋กœ ๊ฒ€์ƒ‰ํ• ๋•Œ: find()๋Š” ๊ฒ€์ƒ‰ํ•˜๊ธฐ์œ„ํ•ด 1์ฐจ์  ๊ฒ€์ƒ‰ ํŠน์„ฑ(primary search characteristic)์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์–ด๋ ต๋‹ค. ์˜ˆ์ œ์—์„œ ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด brute force ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์ด ๊ธฐ๋ฒ•์€ ๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ˆ˜๋™์ ์œผ๋กœ ๋น„๊ตํ•ด๋‚˜๊ฐ„๋‹ค. if ( sNumber == (*iter).get_phone() ) ... ํ”„๋กœ๊ทธ๋žจ์€ ๋จผ์ € ๋ชจ๋“  ์—”ํŠธ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ ๋‚˜์„œ ๊ฒ€์ƒ‰ํ•  ์ด๋ฆ„์„ ๋ฌป๋Š”๋‹ค. ์ž…๋ ฅ๋ฐ›์€ ์ด๋ฆ„์„ ์ฐพ์•„์„œ ์ถœ๋ ฅํ•ด์ฃผ๊ณ , ๋‹ค์Œ๊ณผ์ •์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๋ฌป๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œํ•œ๋ฒˆ ๊ฒ€์ƒ‰์„ ํ•˜๊ฒŒ๋œ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.