ํฌ์ŠคํŠธ

CS โ€” stl containers

CS โ€” stl containers

๐Ÿ“• 05/04 โ€” C++ STL ์ปจํ…Œ์ด๋„ˆ ์ „๋ฐ˜ (์‹œํ€€์Šค ยท ์—ฐ๊ด€ ยท ๋น„์ˆœ์„œ ยท ์–ด๋Œ‘ํ„ฐ)

๋ชจ์˜๋ฉด์ ‘ ๋‹ค์Œ ์ฃผ์ œ: โ€œC++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(STL) ๊ธฐ์ค€ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”โ€ ์ปจํ…Œ์ด๋„ˆ 4๋ถ„๋ฅ˜ โ†’ ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ์‹œ๊ฐ„ ๋ณต์žก๋„ โ†’ ์„ ํƒ ๊ธฐ์ค€ โ†’ vector vs list / map vs unordered_map / iterator ๋ฌดํšจํ™” ๊ผฌ๋ฆฌ์งˆ๋ฌธ ์—ฐ๊ฒฐ ๋‹ค๋ฆฌ


ํ•™์Šต ์˜์—ญ ์ „ํ™˜์  โ€” ๊ฐœ๋ณ„ ์ปจํ…Œ์ด๋„ˆ์—์„œ STL ์ „์ฒด ์ง€๋„๋กœ

13~15๋ฒˆ์—์„œ vector ยท list ยท map ยท unordered_map ์„ ๊ฐœ๋ณ„๋กœ ๊นŠ๊ฒŒ ๋ดค๋‹ค๋ฉด, 16๋ฒˆ์€ ๊ทธ๊ฒƒ๋“ค์„ ํ•˜๋‚˜์˜ ๋ถ„๋ฅ˜ ์ฒด๊ณ„ ์œ„์— ์žฌ๋ฐฐ์น˜ํ•˜๋Š” ์ •๋ฆฌ ๋…ธํŠธ์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
13๋ฒˆ  vector vs list                       โ€” ์‹œํ€€์Šค: ์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ vs ๋ถ„์‚ฐ ๋…ธ๋“œ
14๋ฒˆ  std::map                             โ€” ์—ฐ๊ด€: RB-Tree
14๋ฒˆ ํ›„์†  map followup                     โ€” ๋ชจ์˜๋ฉด์ ‘ ๊ผฌ๋ฆฌ๋ฌผ๊ธฐ
15๋ฒˆ  push_back vs emplace_back            โ€” vector ๊ด€์šฉ๊ตฌ + ํ•ด์‹œ ์ถฉ๋Œ ๋ณด๊ฐ•
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
16๋ฒˆ  STL ์ปจํ…Œ์ด๋„ˆ ์ „๋ฐ˜ โ˜…                  โ€” 4๋ถ„๋ฅ˜ ์ง€๋„ + ์„ ํƒ ๊ธฐ์ค€
์ดํ›„   std::unordered_map deepdive          โ€” ํ•ด์‹œ ๋‹จ๋… ์ •๋ฆฌ

์ด ์ฃผ์ œ๋Š” ๋ฉด์ ‘์—์„œ โ€œ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”โ€ ์‹์œผ๋กœ ๋ฒ”์œ„๊ฐ€ ๋„“๊ฒŒ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. ๋‹ต๋ณ€ ํ๋ฆ„์€ ๋ณดํ†ต (1) 4๊ฐ€์ง€ ๋ถ„๋ฅ˜ โ†’ (2) ๊ฐ ๋ถ„๋ฅ˜ ๋Œ€ํ‘œ ์ปจํ…Œ์ด๋„ˆ 1~2๊ฐœ + ๋‚ด๋ถ€ ๊ตฌ์กฐ โ†’ (3) ์„ ํƒ ๊ธฐ์ค€ 1์ค„ โ†’ (4) ๊ผฌ๋ฆฌ์งˆ๋ฌธ์œผ๋กœ ์žก์Šต๋‹ˆ๋‹ค. ํ•œ ์ปจํ…Œ์ด๋„ˆ๋งŒ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๋ฉด ๋‹ค๋ฅธ ๋ถ„๋ฅ˜๋ฅผ ๋น ๋œจ๋ฆฌ๊ธฐ ์‰ฌ์›Œ์„œ, ๋ถ„๋ฅ˜ ์ง€๋„๋ฅผ ๋จผ์ € ๊ทธ๋ฆฌ๋Š” ๊ฒŒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.


๋ชจ์˜๋ฉด์ ‘ ๋‹ต๋ณ€

C++ STL ์ปจํ…Œ์ด๋„ˆ๋Š” ํฌ๊ฒŒ ์‹œํ€€์Šค(sequence), ์—ฐ๊ด€(associative), ๋น„์ˆœ์„œ ์—ฐ๊ด€(unordered associative), ์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ(container adapter) 4๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ๋Š” ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•œ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. std::vector๋Š” ์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ ๋™์  ๋ฐฐ์—ด๋กœ ์ž„์˜ ์ ‘๊ทผ O(1), ๋ ์‚ฝ์ž…์€ amortized O(1)์ด๊ณ  ์บ์‹œ ์นœํ™”์„ฑ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. std::deque๋Š” ์ฒญํฌ ๊ธฐ๋ฐ˜ ๋”๋ธ”์—”๋“œ ํ๋กœ ์–‘ ๋ push๊ฐ€ O(1)์ด์ง€๋งŒ ์›์†Œ๊ฐ€ ์—ฐ์†์ด ์•„๋‹ˆ๋ผ vector๋ณด๋‹ค ์บ์‹œ ํšจ์œจ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. std::list๋Š” ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, std::forward_list๋Š” ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋…ธ๋“œ๊ฐ€ ํž™์— ๋ถ„์‚ฐ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. std::array๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด๋กœ ์Šคํƒ์— ์žกํžˆ๊ณ  size๊ฐ€ ํƒ€์ž…์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ‚ค ๊ธฐ์ค€์œผ๋กœ ์ž๋™ ์ •๋ ฌ๋˜๋ฉฐ ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌํ˜„์ด Red-Black Tree๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. std::set/std::map์€ ํ‚ค ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ , std::multiset/std::multimap์€ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•ต์‹ฌ ์—ฐ์‚ฐ์ด O(log n) ์ตœ์•… ๋ณด์žฅ์ด๊ณ  ํ‚ค๊ฐ€ ์ •๋ ฌ๋ผ ์žˆ์œผ๋‹ˆ ๋ฒ”์œ„ ์กฐํšŒ(lower_bound, upper_bound)๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋น„์ˆœ์„œ ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. std::unordered_set/std::unordered_map์ด ๋Œ€ํ‘œ์ด๊ณ  ํ‰๊ท  O(1) ์กฐํšŒยท์‚ฝ์ž…ยท์‚ญ์ œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ์ •๋ ฌ์ด ์•ˆ ๋˜๊ณ  ์ตœ์•…์€ O(n)(ํ•ด์‹œ ์ถฉ๋Œ)์ž…๋‹ˆ๋‹ค. STL์€ ์ถฉ๋Œ์„ ์ฒด์ด๋‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ , ๋กœ๋“œ ํŒฉํ„ฐ๊ฐ€ ํ•œ๊ณ„๋ฅผ ๋„˜์œผ๋ฉด rehash๋กœ ๋ฒ„ํ‚ท ๋ฐฐ์—ด์„ ํ™•์žฅํ•˜๋Š”๋ฐ ์ด๋•Œ ๋ชจ๋“  iterator๊ฐ€ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ๋Š” ๊ธฐ์กด ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ์‹ธ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œํ•œํ•œ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค. std::stack์€ LIFO, std::queue๋Š” FIFO๋กœ ๊ธฐ๋ณธ์€ deque๋ฅผ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋กœ ์”๋‹ˆ๋‹ค. std::priority_queue๋Š” ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์ตœ๋Œ“๊ฐ’(๋˜๋Š” ์ตœ์†Ÿ๊ฐ’) ์ถ”์ถœ์ด O(log n)์ด๊ณ  ๊ธฐ๋ณธ์€ vector + std::make_heap ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

์„ ํƒ ๊ธฐ์ค€์€ ์งง๊ฒŒ โ€œ์˜์‹ฌ์Šค๋Ÿฌ์šฐ๋ฉด vector, ํ‚ค ์ •๋ ฌ๊ณผ ์ตœ์•… ๋ณด์žฅ์ด ํ•„์š”ํ•˜๋ฉด map, ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํ•„์š”ํ•˜๋ฉด unordered_map, ์ถ”์ƒ ์ž๋ฃŒ๊ตฌ์กฐ ์˜๋ฏธ๋งŒ ํ•„์š”ํ•˜๋ฉด ์–ด๋Œ‘ํ„ฐโ€๋กœ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ํ•จ์ •์€ vector vs list (์ด๋ก ๊ณผ ์‹ค์ธก์ด ์ •๋ฐ˜๋Œ€), map vs unordered_map (์ •๋ ฌ vs ํ‰๊ท  O(1)), vector ์žฌํ• ๋‹น ์‹œ iterator ๋ฌดํšจํ™” ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.


ํ•ต์‹ฌ ๊ฐœ๋…

๋ถ„๋ฅ˜ํ‚ค์›Œ๋“œํ•œ ์ค„ ์ •์˜
4๋Œ€ ๋ถ„๋ฅ˜Sequence Container์‚ฝ์ž… ์ˆœ์„œ ๋ณด๊ด€. vector, deque, list, forward_list, array
ย Associative ContainerRB-Tree ๊ธฐ๋ฐ˜ ์ •๋ ฌ. set, multiset, map, multimap
ย Unordered Associativeํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜. unordered_set/map (+ multi ๋ฒ„์ „)
ย Container Adapter๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ ๋ž˜ํผ. stack, queue, priority_queue
์‹œํ€€์Šคstd::vector์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ ๋™์  ๋ฐฐ์—ด. ์ž„์˜ ์ ‘๊ทผ O(1), ์บ์‹œ ์ตœ๊ฐ•
ย std::deque์ฒญํฌ ๋ฐฐ์—ด + ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”. ์–‘ ๋ push O(1)
ย std::list์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ. ๋…ธ๋“œ ๋ถ„์‚ฐ. splice/merge๊ฐ€ ๊ฐ•์ 
ย std::forward_list๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ. ๋…ธ๋“œ๋‹น 8B ์ ˆ์•ฝ
ย std::array<T, N>๊ณ ์ • ํฌ๊ธฐ ์Šคํƒ ๋ฐฐ์—ด. C ๋ฐฐ์—ด + STL ์ธํ„ฐํŽ˜์ด์Šค
์—ฐ๊ด€std::set / std::mapRB-Tree. ํ‚ค ์ค‘๋ณต ๋ถˆ๊ฐ€. O(log n) ์ตœ์•… ๋ณด์žฅ
ย std::multiset / std::multimap๋™์ผ ํ‚ค ์ค‘๋ณต ํ—ˆ์šฉ. equal_range ๋ฒ”์œ„ ์กฐํšŒ
ย Red-Black Tree์ž๊ธฐ ๊ท ํ˜• BST. 5์†์„ฑ์œผ๋กœ ๋†’์ด O(log n) ๋ณด์žฅ
ย ๋ฒ”์œ„ ์กฐํšŒ (lower_bound)์ •๋ ฌ ํŠธ๋ฆฌ๋งŒ ๊ฐ€๋Šฅ. ํ•ด์‹œ๋Š” ๋ถˆ๊ฐ€
๋น„์ˆœ์„œstd::unordered_set/mapํ•ด์‹œ ํ…Œ์ด๋ธ”. ํ‰๊ท  O(1), ์ตœ์•… O(n)
ย ๋ฒ„ํ‚ท (Bucket)ํ•ด์‹œ๊ฐ’ ๋งคํ•‘ ์Šฌ๋กฏ. ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌ
ย ์ฒด์ด๋‹ (Chaining)๊ฐ™์€ ๋ฒ„ํ‚ท ์›์†Œ๋ฅผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌถ์Œ (STL ์ฑ„ํƒ)
ย ๋กœ๋“œ ํŒฉํ„ฐ (Load Factor)size / bucket_count. ์ดˆ๊ณผ ์‹œ rehash
ย rehash๋ฒ„ํ‚ท ํ™•์žฅ + ์žฌ๋ฐฐ์น˜. ๋ชจ๋“  iterator ๋ฌดํšจํ™”
์–ด๋Œ‘ํ„ฐstd::stackLIFO. ๊ธฐ๋ณธ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ = deque
ย std::queueFIFO. ๊ธฐ๋ณธ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ = deque
ย std::priority_queue์ด์ง„ ํž™. push/pop O(log n). ๊ธฐ๋ณธ = vector
์‹œ๊ฐ„ ๋ณต์žก๋„amortized O(1)vector push_back. ํ‰๊ท  O(1)์ด์ง€๋งŒ ๊ฐ€๋” O(n) ์žฌํ• ๋‹น
ย O(log n) ์ตœ์•…map ์—ฐ์‚ฐ. ํŠธ๋ฆฌ ๋†’์ด์— ๋น„๋ก€
ย O(1) ํ‰๊ท  / O(n) ์ตœ์•…unordered_map. ์ถฉ๋Œ ์‹œ ์ตœ์•…
iterator ๋ฌดํšจํ™”vector ์žฌํ• ๋‹นcapacity ์ดˆ๊ณผ ์‹œ ๋ชจ๋“  iterator/ํฌ์ธํ„ฐ/์ฐธ์กฐ ๋ฌดํšจํ™”
ย vector ๋ถ€๋ถ„insert/erase ์‹œ ํ•ด๋‹น ์œ„์น˜ ์ดํ›„ ๋ฌดํšจํ™”
ย ๋…ธ๋“œ ์•ˆ์ •์„ฑlist/map์€ ์‚ญ์ œ๋œ ๋…ธ๋“œ๋งŒ ๋ฌดํšจ (splice ์•ˆ์ „)
ย rehash ๋ฌดํšจํ™”unordered_map rehash ์‹œ ๋ชจ๋“  iterator ๋ฌดํšจํ™”
์„ ํƒ ๊ธฐ์ค€โ€œVector firstโ€ ๋ฃฐStroustrup โ€” ์˜์‹ฌ์Šค๋Ÿฌ์šฐ๋ฉด vector
ย map vs unordered_map์ •๋ ฌยท๋ฒ”์œ„ยท์ตœ์•…๋ณด์žฅ vs ํ‰๊ท  ์ฒ˜๋ฆฌ๋Ÿ‰
ย stack/queue vs vector/deque ์ง์ ‘์˜๋„ ํ‘œํ˜„์ด ํ•ต์‹ฌ. ์„ฑ๋Šฅ์€ ๋™์ผ

๋ชฉ์ฐจ

  1. ํ•ต์‹ฌ ์š”์•ฝ ์นด๋“œ
  2. STL ์ปจํ…Œ์ด๋„ˆ 4๋Œ€ ๋ถ„๋ฅ˜
  3. ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ โ€” vector / deque / list / forward_list / array
  4. ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ โ€” set / multiset / map / multimap (RB-Tree)
  5. ๋น„์ˆœ์„œ ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ โ€” unordered_set / unordered_map (ํ•ด์‹œ)
  6. ์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ โ€” stack / queue / priority_queue
  7. ์„ ํƒ ๊ธฐ์ค€ โ€” ์–ธ์ œ ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์“ฐ๋‚˜
  8. iterator ๋ฌดํšจํ™” ๊ทœ์น™ ํ•œ๋ˆˆ์—
  9. ํšŒ๊ท€ ๋‹ค๋ฆฌ โ€” ๋‹ค๋ฅธ CS ํŒŒ์ผ ์—ฐ๊ฒฐ
  10. ๊ผฌ๋ฆฌ์งˆ๋ฌธ ์˜ˆ์ƒ ๊ฒฝ๋กœ
  11. ์–ธ๋ฆฌ์–ผ์—์„œ์˜ STL ์ปจํ…Œ์ด๋„ˆ ๋Œ€์‘
  12. ๋ชจ์˜๋ฉด์ ‘ ๋‹ต๋ณ€ ํ…œํ”Œ๋ฆฟ (1๋ถ„ / 3๋ถ„)

1. ํ•ต์‹ฌ ์š”์•ฝ ์นด๋“œ

ํ•œ ์ค„ ์š”์•ฝ 30์ดˆ

1
2
3
4
5
์‹œํ€€์Šค       โ€” ์ˆœ์„œ ๋ณด๊ด€: vector(์—ฐ์†), deque(์ฒญํฌ), list(๋…ธ๋“œ), forward_list(๋‹จ๋ฐฉํ–ฅ), array(๊ณ ์ •)
์—ฐ๊ด€         โ€” RB-Tree ์ •๋ ฌ: set/map (+ multi), O(log n) ์ตœ์•… ๋ณด์žฅ
๋น„์ˆœ์„œ ์—ฐ๊ด€  โ€” ํ•ด์‹œ ํ…Œ์ด๋ธ”: unordered_set/map, ํ‰๊ท  O(1) / ์ตœ์•… O(n)
์–ด๋Œ‘ํ„ฐ       โ€” ์ธํ„ฐํŽ˜์ด์Šค ๋ž˜ํผ: stack(LIFO), queue(FIFO), priority_queue(ํž™)
๋ฃฐ           โ€” ์˜์‹ฌ์Šค๋Ÿฌ์šฐ๋ฉด vector. ์ •๋ ฌ ํ•„์š” โ†’ map. ์ฒ˜๋ฆฌ๋Ÿ‰ โ†’ unordered_map.

4๋ถ„๋ฅ˜ ์ง€๋„ 30์ดˆ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
STL Container
โ”œโ”€โ”€ Sequence (์‚ฝ์ž… ์ˆœ์„œ ๋ณด๊ด€)
โ”‚   โ”œโ”€โ”€ vector          ์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ, ์บ์‹œ ์ตœ๊ฐ•       O(1) random / amortized O(1) push_back
โ”‚   โ”œโ”€โ”€ deque           ์ฒญํฌ + ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”          ์–‘ ๋ push O(1), ์ž„์˜ ์ ‘๊ทผ O(1)
โ”‚   โ”œโ”€โ”€ list            ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ              ์ž„์˜ ์ ‘๊ทผ O(n), ์ค‘๊ฐ„ splice ๊ฐ•์ 
โ”‚   โ”œโ”€โ”€ forward_list    ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ            ๋…ธ๋“œ๋‹น 8B ์ ˆ์•ฝ, before_begin ์‚ฌ์šฉ
โ”‚   โ””โ”€โ”€ array<T, N>     ๊ณ ์ • ํฌ๊ธฐ, ์Šคํƒ ๊ฐ€๋Šฅ          size๊ฐ€ ํƒ€์ž… ์ผ๋ถ€ (์ปดํŒŒ์ผ ํƒ€์ž„)
โ”‚
โ”œโ”€โ”€ Associative (RB-Tree, ์ •๋ ฌ)
โ”‚   โ”œโ”€โ”€ set / multiset      ํ‚ค๋งŒ, ์ •๋ ฌ ์ž๋™           O(log n) ์ตœ์•… ๋ณด์žฅ
โ”‚   โ””โ”€โ”€ map / multimap      ํ‚ค-๊ฐ’, ์ •๋ ฌ ์ž๋™           O(log n) + ๋ฒ”์œ„ ์กฐํšŒ ๊ฐ€๋Šฅ
โ”‚
โ”œโ”€โ”€ Unordered Associative (ํ•ด์‹œ ํ…Œ์ด๋ธ”, ์ฒด์ด๋‹)
โ”‚   โ”œโ”€โ”€ unordered_set       ํ‰๊ท  O(1), ์ •๋ ฌ ์—†์Œ
โ”‚   โ””โ”€โ”€ unordered_map       ํ‰๊ท  O(1), rehash ์‹œ iterator ์ „์ฒด ๋ฌดํšจํ™”
โ”‚
โ””โ”€โ”€ Container Adapter (์ธํ„ฐํŽ˜์ด์Šค ๋ž˜ํผ)
    โ”œโ”€โ”€ stack               LIFO, ๊ธฐ๋ณธ deque ์‚ฌ์šฉ
    โ”œโ”€โ”€ queue               FIFO, ๊ธฐ๋ณธ deque ์‚ฌ์šฉ
    โ””โ”€โ”€ priority_queue      ์ด์ง„ ํž™, ๊ธฐ๋ณธ vector + make_heap

์‹œ๊ฐ„ ๋ณต์žก๋„ ํ‘œ 30์ดˆ

์ปจํ…Œ์ด๋„ˆ์ž„์˜ ์ ‘๊ทผ๋ ์‚ฝ์ž…์•ž ์‚ฝ์ž…์ค‘๊ฐ„ ์‚ฝ์ž…๊ฒ€์ƒ‰์ •๋ ฌiterator ์•ˆ์ •์„ฑ
vectorO(1)amortized O(1)O(n)O(n)O(n)์ˆ˜๋™์•ฝํ•จ (์žฌํ• ๋‹น)
dequeO(1)O(1)O(1)O(n)O(n)์ˆ˜๋™์•ฝํ•จ
listO(n)O(1)O(1)O(1) (์œ„์น˜ ์•Œ ๋•Œ)O(n)๋ฉค๋ฒ„ sort๊ฐ•ํ•จ (๋…ธ๋“œ)
forward_listO(n)โ€”O(1)O(1)O(n)๋ฉค๋ฒ„ sort๊ฐ•ํ•จ
arrayO(1)โ€”โ€”โ€”O(n)์ˆ˜๋™๊ฐ•ํ•จ
set/mapO(log n)O(log n)O(log n)O(log n)O(log n)์ž๋™๊ฐ•ํ•จ
unordered_set/mapโ€”ํ‰๊ท  O(1)ํ‰๊ท  O(1)ํ‰๊ท  O(1)ํ‰๊ท  O(1)์—†์Œrehash ์‹œ ์ „์ฒด ๋ฌดํšจ
priority_queuetop O(1)push O(log n)โ€”โ€”โ€”ํž™ ์ •๋ ฌiterator ์—†์Œ

๊ผฌ๋ฆฌ์งˆ๋ฌธ ์—ฐ๊ฒฐ ๋งต

1
2
3
4
5
6
7
8
9
10
11
12
์ปจํ…Œ์ด๋„ˆ ๋ถ„๋ฅ˜ ๋‹ต๋ณ€
โ”œโ”€โ”€ "์‹œํ€€์Šค์—์„œ vector vs list?"  โ†’ 13๋ฒˆ ํšŒ๊ท€ (์บ์‹œ ์นœํ™”์„ฑ, 100๋ฐฐ ์ฐจ์ด)
โ”‚    โ””โ”€โ”€ "iterator ๋ฌดํšจํ™” ์ฐจ์ด๋Š”?" โ†’ ์žฌํ• ๋‹น vs ๋…ธ๋“œ ์•ˆ์ •์„ฑ
โ”œโ”€โ”€ "map vs unordered_map?"        โ†’ 14๋ฒˆ ํšŒ๊ท€ (RB-Tree vs ํ•ด์‹œ)
โ”‚    โ”œโ”€โ”€ "ํ•ด์‹œ ์ถฉ๋Œ ์ฒ˜๋ฆฌ?"          โ†’ 15๋ฒˆ ํ›„๋ฐ˜๋ถ€ (์ฒด์ด๋‹ vs ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ)
โ”‚    โ””โ”€โ”€ "rehash ์‹œ ๋ฌด์—‡์ด ๋ฌดํšจํ™”?" โ†’ ๋ชจ๋“  iterator
โ”œโ”€โ”€ "vector capacity ๋™์ž‘?"         โ†’ 15๋ฒˆ (reserve, 1.5x ~ 2x growth)
โ”‚    โ””โ”€โ”€ "์žฌํ• ๋‹น ์‹œ ๋น„์šฉ?"           โ†’ ๋ชจ๋“  ์›์†Œ ์ด๋™ + ๊ธฐ์กด ๋ธ”๋ก ํ•ด์ œ
โ”œโ”€โ”€ "์–ด๋Œ‘ํ„ฐ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋Š”?"       โ†’ stack/queue=deque, priority_queue=vector
โ”‚    โ””โ”€โ”€ "์™œ deque๊ฐ€ ๊ธฐ๋ณธ?"          โ†’ ์–‘ ๋ O(1) + ์ค‘๊ฐ„ ์žฌํ• ๋‹น ์—†์Œ
โ””โ”€โ”€ "์–ธ๋ฆฌ์–ผ์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€?"       โ†’ TArray (vector), TMap (unordered_map),
                                        TSortedMap (์ •๋ ฌ ๋ฐฐ์—ด, RB-Tree ์•„๋‹˜)

2. STL ์ปจํ…Œ์ด๋„ˆ 4๋Œ€ ๋ถ„๋ฅ˜

๋ถ„๋ฅ˜ ๊ธฐ์ค€

STL ์ปจํ…Œ์ด๋„ˆ๋Š” โ€œ์›์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด๊ด€ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์ฐพ๋Š”๊ฐ€โ€ ๋ผ๋Š” ๋‘ ์ถ•์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
                      ์–ด๋–ป๊ฒŒ ๋ณด๊ด€?
                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚  ์ˆœ์„œ ๋ณด๊ด€       โ”‚  โ†’ Sequence
                  โ”‚  (insertion order)โ”‚
                  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
                  โ”‚  ํ‚ค ๊ธฐ์ค€ ์ •๋ ฌ    โ”‚  โ†’ Associative   (RB-Tree)
                  โ”‚  (sorted by key) โ”‚
                  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
                  โ”‚  ํ‚ค ๊ธฐ์ค€ ๋ถ„์‚ฐ    โ”‚  โ†’ Unordered Assoc (Hash)
                  โ”‚  (hashed bucket) โ”‚
                  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
                  โ”‚  ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ   โ”‚  โ†’ Container Adapter
                  โ”‚  ๋ฅผ ๊ฐ์‹ผ ์ธํ„ฐํŽ˜์ด์Šคโ”‚
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ํ‘œ์ค€ ํ—ค๋”์™€ ๋„์ž… ์‹œ์ 

๋ถ„๋ฅ˜์ปจํ…Œ์ด๋„ˆํ—ค๋”๋„์ž…
Sequencevector<vector>C++98
ย deque<deque>C++98
ย list<list>C++98
ย forward_list<forward_list>C++11
ย array<T, N><array>C++11
Associativeset / multiset<set>C++98
ย map / multimap<map>C++98
Unorderedunordered_set / multiset<unordered_set>C++11
ย unordered_map / multimap<unordered_map>C++11
Adapterstack<stack>C++98
ย queue / priority_queue<queue>C++98

forward_list, array, unordered_*์€ C++11์—์„œ ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค. ์ด์ „์—” boost๋‚˜ ์‚ฌ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€์ด ์ •ํ•œ โ€œ์ปจํ…Œ์ด๋„ˆ ์š”๊ตฌ์‚ฌํ•ญโ€

๋ชจ๋“  STL ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค:

1
2
3
4
5
6
container.size();        // ์›์†Œ ์ˆ˜
container.empty();       // ๋น„์—ˆ๋Š”์ง€
container.begin();       // iterator
container.end();
container.swap(other);   // ๊ตํ™˜
container.clear();       // ๋น„์šฐ๊ธฐ

์ด ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ๋•๋ถ„์— ์•Œ๊ณ ๋ฆฌ์ฆ˜(std::sort, std::find, std::for_each)์ด ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฅ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.


3. ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ โ€” vector / deque / list / forward_list / array

ํ•ต์‹ฌ ํ•œ ๋ฌธ์žฅ

์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ๋Š” ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•œ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ด€ํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์— ๋”ฐ๋ผ ์ž„์˜ ์ ‘๊ทผยท์บ์‹œ ์นœํ™”์„ฑยทiterator ์•ˆ์ •์„ฑ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๊ฐˆ๋ฆฝ๋‹ˆ๋‹ค.

3.1 std::vector โ€” ์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ ๋™์  ๋ฐฐ์—ด

1
2
3
4
5
6
7
std::vector<int> v;
v.reserve(1000);              // capacity๋งŒ ๋ฏธ๋ฆฌ ํ™•๋ณด
v.push_back(42);              // amortized O(1)
v.emplace_back(43);           // ์Šฌ๋กฏ์—์„œ ์ง์ ‘ ์ƒ์„ฑ

int x = v[0];                 // O(1) ์ž„์˜ ์ ‘๊ทผ
v.insert(v.begin() + 5, 99);  // O(n), ๋’ค์ชฝ ์›์†Œ ์‹œํ”„ํŠธ
  • ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ: ํž™์— ์—ฐ์† ๋ธ”๋ก 1๊ฐœ. ์บ์‹œ ๋ผ์ธ์— ์—ฌ๋Ÿฌ ์›์†Œ๊ฐ€ ๋™์‹œ ๋กœ๋“œ.
  • ์žฌํ• ๋‹น: capacity ์ดˆ๊ณผ ์‹œ 1.5x(MSVC) ~ 2x(libstdc++)๋กœ ์ƒˆ ๋ฒ„ํผ ํ• ๋‹น + ๋ชจ๋“  ์›์†Œ ์ด๋™.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„: ์ž„์˜ ์ ‘๊ทผ O(1), ๋ push amortized O(1), ์ค‘๊ฐ„ ์‚ฝ์ž… O(n).
  • iterator ๋ฌดํšจํ™”: ์žฌํ• ๋‹น ์‹œ ์ „์ฒด ๋ฌดํšจ, ๋ถ€๋ถ„ ์‚ฝ์ž…/์‚ญ์ œ ์‹œ ํ•ด๋‹น ์œ„์น˜ ์ดํ›„ ๋ฌดํšจ.

3.2 std::deque โ€” ์ฒญํฌ ๊ธฐ๋ฐ˜ ๋”๋ธ”์—”๋“œ ํ

1
2
3
4
std::deque<int> dq;
dq.push_front(1);             // O(1)
dq.push_back(2);              // O(1)
int x = dq[0];                // O(1) โ€” ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ” ๊ฑฐ์น˜์ง€๋งŒ amortized O(1)
  • ๋‚ด๋ถ€ ๊ตฌ์กฐ: ์ž‘์€ ์ฒญํฌ๋“ค์˜ ๋ฐฐ์—ด + ์ฒญํฌ ํฌ์ธํ„ฐ๋ฅผ ๋ชจ์€ ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”(๋งต).
  • ์žฅ์ : ์–‘ ๋ push๊ฐ€ ๋ชจ๋‘ O(1)์ด๊ณ  ์ž„์˜ ์ ‘๊ทผ๋„ ๊ฐ€๋Šฅ.
  • ๋‹จ์ : ์›์†Œ๊ฐ€ ์—ฐ์†์ด ์•„๋‹ˆ๋ผ vector๋ณด๋‹ค ์บ์‹œ ํšจ์œจ์ด ๋–จ์–ด์ง€๊ณ , ์ฒญํฌ ๊ฒฝ๊ณ„์—์„œ prefetch๊ฐ€ ๋Š๊น€.
  • ์šฉ๋„: std::stack / std::queue์˜ ๊ธฐ๋ณธ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ.

3.3 std::list โ€” ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

1
2
3
4
5
6
std::list<int> lst = {1, 2, 3};
auto it = std::next(lst.begin(), 1);
lst.insert(it, 99);           // O(1) (์œ„์น˜ ์•Œ ๋•Œ)

std::list<int> other = {10, 20};
lst.splice(lst.end(), other); // O(1) โ€” ๋…ธ๋“œ ํฌ์ธํ„ฐ๋งŒ ์žฌ๋ฐฐ์น˜ โ˜…
  • ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ: ๋…ธ๋“œ๋งˆ๋‹ค ๋ณ„๋„ ํž™ ํ• ๋‹น. ๋…ธ๋“œ = [prev*][next*][data] + ํž™ ํ—ค๋”.
  • ์žฅ์ : ์ค‘๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ O(1)(์œ„์น˜ ์•Œ ๋•Œ), splice/merge๊ฐ€ ๋…ธ๋“œ ํฌ์ธํ„ฐ ์žฌ๋ฐฐ์น˜๋งŒ์œผ๋กœ ๋™์ž‘.
  • ๋‹จ์ : ์บ์‹œ ์ ๋Œ€์  โ€” ๋…ธ๋“œ๊ฐ€ ํž™ ์—ฌ๊ธฐ์ €๊ธฐ ํฉ์–ด์ ธ ๋งค ์ ‘๊ทผ๋งˆ๋‹ค ์บ์‹œ ๋ฏธ์Šค. ์ด๋ก  vs ์‹ค์ธก 100๋ฐฐ ์ฐจ์ด.
  • ์‚ฌ์šฉ ์ผ€์ด์Šค: ๋งค์šฐ ํฐ ๊ฐ์ฒด + ์žฆ์€ splice + iterator ์•ˆ์ •์„ฑ์ด ์ ˆ๋Œ€ ํ•„์š”ํ•  ๋•Œ๋งŒ.

3.4 std::forward_list โ€” ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

1
2
3
std::forward_list<int> fl = {1, 2, 3};
fl.push_front(0);                       // O(1)
fl.insert_after(fl.before_begin(), 99); // ํ—ค๋“œ ์•ž์— ์‚ฝ์ž…
  • ๋‚ด๋ถ€ ๊ตฌ์กฐ: next ํฌ์ธํ„ฐ๋งŒ ๊ฐ€์ง„ ๋‹จ๋ฐฉํ–ฅ ๋…ธ๋“œ. prev ์—†์œผ๋‹ˆ ๋…ธ๋“œ๋‹น 8๋ฐ”์ดํŠธ ์ ˆ์•ฝ.
  • API ์ฐจ์ด: insert_after, erase_after, before_begin() โ€” ์–‘๋ฐฉํ–ฅ list์™€ ๋‹ค๋ฆ„.
  • size()๊ฐ€ ์—†๋‹ค: O(1)๋กœ size๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†์–ด์„œ ํ‘œ์ค€์ด ์ผ๋ถ€๋Ÿฌ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—์„œ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์šฉ๋„: ๋ฉ”๋ชจ๋ฆฌ ๊ทน๋‹จ์œผ๋กœ ์•„๊ปด์•ผ ํ•˜๋Š” ์ž„๋ฒ ๋””๋“œ / ๋งค์šฐ ์ž‘์€ ๋…ธ๋“œ.

3.5 std::array<T, N> โ€” ๊ณ ์ • ํฌ๊ธฐ ์Šคํƒ ๋ฐฐ์—ด

1
2
3
4
5
6
std::array<int, 4> arr = {1, 2, 3, 4};
arr[2] = 99;                  // O(1)
auto sz = arr.size();         // 4 (์ปดํŒŒ์ผ ํƒ€์ž„ ์ƒ์ˆ˜)

// ํ•จ์ˆ˜ ์ธ์ž๋กœ ์ „๋‹ฌ ์‹œ size๊ฐ€ ํƒ€์ž…์— ๋ฐ•ํž˜
void f(std::array<int, 4>& a);  // 4๊ฐ€ ์•„๋‹Œ array๋Š” ์ „๋‹ฌ ๋ถˆ๊ฐ€
  • ์ปดํŒŒ์ผ ํƒ€์ž„ size: N์ด ํƒ€์ž…์˜ ์ผ๋ถ€. ๋‹ค๋ฅธ size์˜ array๋Š” ๋‹ค๋ฅธ ํƒ€์ž….
  • ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜: ๋ณดํ†ต ์Šคํƒ. ๋™์  ํ• ๋‹น ์—†์Œ.
  • C ๋ฐฐ์—ด ๋Œ€๋น„ ์žฅ์ : ํ‘œ์ค€ ์ปจํ…Œ์ด๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค(size, begin, end), ํ•จ์ˆ˜์— ๊ฐ’์œผ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ, range-for ๋™์ž‘.
  • ์‚ฌ์šฉ ์ผ€์ด์Šค: ํฌ๊ธฐ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ณ ์ •๋œ ์ž‘์€ ๋ฐฐ์—ด. ๊ฒŒ์ž„์—์„œ ์ขŒํ‘œยทํ–‰๋ ฌ ๊ฐ™์€ ๊ฒƒ.

์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ ๋น„๊ต ์š”์•ฝ

ย vectordequelistforward_listarray<T,N>
๋ฉ”๋ชจ๋ฆฌ์—ฐ์† 1๋ธ”๋ก์ฒญํฌ + ํ…Œ์ด๋ธ”๋…ธ๋“œ ๋ถ„์‚ฐ๋…ธ๋“œ ๋ถ„์‚ฐ์—ฐ์† (์Šคํƒ)
์ž„์˜ ์ ‘๊ทผO(1)O(1)O(n)O(n)O(1)
๋ pushamortized O(1)O(1)O(1)โ€”๋ถˆ๊ฐ€
์•ž pushO(n)O(1)O(1)O(1)โ€”
์บ์‹œ ์นœํ™”์„ฑโ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…
iterator ์•ˆ์ •์„ฑ์•ฝํ•จ์•ฝํ•จ๊ฐ•ํ•จ๊ฐ•ํ•จ๊ฐ•ํ•จ (๊ณ ์ •)
๋™์  sizeOOOOX (๊ณ ์ •)

4. ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ โ€” set / multiset / map / multimap (RB-Tree)

ํ•ต์‹ฌ ํ•œ ๋ฌธ์žฅ

์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ‚ค ๊ธฐ์ค€์œผ๋กœ ์ž๋™ ์ •๋ ฌ๋œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๊ณ , ๊ฑฐ์˜ ๋ชจ๋“  STL ๊ตฌํ˜„์ด Red-Black Tree๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ์—ฐ์‚ฐ์ด O(log n) ์ตœ์•… ๋ณด์žฅ์ž…๋‹ˆ๋‹ค.

4๋ถ„๋ฅ˜

์ปจํ…Œ์ด๋„ˆํ‚ค ์ค‘๋ณต๊ฐ’
set<K>๋ถˆ๊ฐ€ํ‚ค๋งŒ
multiset<K>๊ฐ€๋Šฅํ‚ค๋งŒ
map<K, V>๋ถˆ๊ฐ€ํ‚ค-๊ฐ’
multimap<K, V>๊ฐ€๋Šฅํ‚ค-๊ฐ’

Red-Black Tree 5์†์„ฑ (์š”์•ฝ)

์ž๊ธฐ ๊ท ํ˜• BST๋กœ, ๋…ธ๋“œ์— ๋นจ๊ฐ•ยท๊ฒ€์ • ์ƒ‰๊น”์„ ๋ถ€์—ฌํ•˜๊ณ  5์†์„ฑ์„ ์œ ์ง€ํ•ด ํŠธ๋ฆฌ ๋†’์ด๋ฅผ ํ•ญ์ƒ O(log n) ์œผ๋กœ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋นจ๊ฐ• ๋˜๋Š” ๊ฒ€์ •
  2. ๋ฃจํŠธ๋Š” ๊ฒ€์ •
  3. ๋ชจ๋“  NIL(๋ฆฌํ”„)์€ ๊ฒ€์ •
  4. ๋นจ๊ฐ• ๋…ธ๋“œ์˜ ์ž์‹์€ ๋ฐ˜๋“œ์‹œ ๊ฒ€์ • (๋นจ๊ฐ• ์—ฐ์† ๊ธˆ์ง€)
  5. ์ž„์˜ ๋…ธ๋“œ โ†’ NIL ๊ฒฝ๋กœ์˜ ๊ฒ€์ • ๋…ธ๋“œ ์ˆ˜ ๋™์ผ (black height)

์‚ฝ์ž…ยท์‚ญ์ œ ์‹œ ํšŒ์ „(rotation) ๊ณผ ์žฌ์ƒ‰์น (recoloring) ๋กœ ์†์„ฑ์„ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. (์ž์„ธํžˆ๋Š” 14๋ฒˆ ํŒŒ์ผ ์ฐธ๊ณ .)

์ •๋ ฌ ํŠธ๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ โ€” ๋ฒ”์œ„ ์กฐํšŒ

1
2
3
4
5
6
7
8
9
std::map<int, std::string> m = {{1, "A"}, {3, "C"}, {5, "E"}, {7, "G"}};

// ํ‚ค๊ฐ€ 3 ์ด์ƒ 6 ๋ฏธ๋งŒ์ธ ๋ฒ”์œ„
auto lo = m.lower_bound(3);   // 3
auto hi = m.upper_bound(6);   // 7 (6๋ณด๋‹ค ํฐ ์ฒซ ํ‚ค)
for (auto it = lo; it != hi; ++it) { /* 3, 5 */ }

// equal_range โ€” multimap ์—์„œ ๋™์ผ ํ‚ค ๊ทธ๋ฃน
auto [first, last] = m.equal_range(3);

์ด๊ฑด ์ •๋ ฌ ํŠธ๋ฆฌ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•ด์‹œ ํ…Œ์ด๋ธ”(unordered_map)์€ ํ‚ค ์ˆœ์„œ๊ฐ€ ์—†์œผ๋‹ˆ ๋ฒ”์œ„ ์กฐํšŒ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Custom Compare

1
2
3
4
5
6
7
8
// ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
std::map<int, std::string, std::greater<int>> desc_map;

// ๋žŒ๋‹ค๋กœ ๋น„๊ต ํ•จ์ˆ˜ ์ง€์ •
auto cmp = [](const std::string& a, const std::string& b) {
    return a.size() < b.size();
};
std::set<std::string, decltype(cmp)> s(cmp);

iterator ๋ฌดํšจํ™” โ€” ๋…ธ๋“œ ์•ˆ์ •์„ฑ

1
2
3
4
5
std::map<int, std::string> m = {{1, "A"}, {2, "B"}};
auto it = m.find(1);
m[3] = "C";                  // ๋‹ค๋ฅธ iterator ๋ชจ๋‘ ์•ˆ์ „
m.erase(2);                  // ์‚ญ์ œ๋œ ๋…ธ๋“œ์˜ iterator๋งŒ ๋ฌดํšจ
// it ๋Š” ์—ฌ์ „ํžˆ ์œ ํšจ

list์™€ ๊ฐ™์€ ๋…ธ๋“œ ์•ˆ์ •์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค โ€” RB-Tree๊ฐ€ ๋…ธ๋“œ๋ฅผ ํž™์— ๋ถ„์‚ฐ ํ• ๋‹นํ•˜๋ฏ€๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋”ฐ๋ผ์˜ต๋‹ˆ๋‹ค. ๊ทธ ๋Œ€์‹  ์บ์‹œ ์นœํ™”์„ฑ์€ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.


5. ๋น„์ˆœ์„œ ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ โ€” unordered_set / unordered_map (ํ•ด์‹œ)

ํ•ต์‹ฌ ํ•œ ๋ฌธ์žฅ

๋น„์ˆœ์„œ ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์œผ๋กœ ํ‰๊ท  O(1) ์กฐํšŒยท์‚ฝ์ž…ยท์‚ญ์ œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ์ •๋ ฌ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ตœ์•…์€ O(n) (ํ•ด์‹œ ์ถฉ๋Œ ์‹œ).

๋‚ด๋ถ€ ๊ตฌ์กฐ

1
2
3
4
5
6
7
8
9
[ Bucket Array ]
    โ”‚
  [0] โ†’ (k1, v1) โ†’ (k4, v4)        โ† ์ฒด์ด๋‹ (์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)
  [1] โ†’ (k2, v2)
  [2] โ†’ nullptr
  [3] โ†’ (k3, v3)
  [4] โ†’ ...

bucket_index(key) = hash(key) % bucket_count
  • ๋ฒ„ํ‚ท (Bucket): ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋งคํ•‘๋˜๋Š” ์Šฌ๋กฏ. ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌ.
  • ์ฒด์ด๋‹ (Separate Chaining): ๊ฐ™์€ ๋ฒ„ํ‚ท์˜ ์›์†Œ๋ฅผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌถ์Œ. STL์ด ์ฑ„ํƒ.
  • ํ•ด์‹œ ํ•จ์ˆ˜: ํ‚ค โ†’ ์ •์ˆ˜. ๊ท ๋“ฑ ๋ถ„ํฌ๊ฐ€ ํ•ต์‹ฌ.
  • ๋กœ๋“œ ํŒฉํ„ฐ: size / bucket_count. max_load_factor()(๊ธฐ๋ณธ 1.0) ์ดˆ๊ณผ ์‹œ rehash.

rehash โ€” ๋ชจ๋“  iterator ๋ฌดํšจํ™”

1
2
3
4
std::unordered_map<int, std::string> um;
auto it = um.find(1);
um.insert({100, "A"});       // ๋กœ๋“œ ํŒฉํ„ฐ ์ดˆ๊ณผ ์‹œ rehash ํŠธ๋ฆฌ๊ฑฐ ๊ฐ€๋Šฅ
// rehash ๋ฐœ์ƒํ•˜๋ฉด it ๋ฌดํšจํ™”!

rehash๋Š” ๋ฒ„ํ‚ท ๋ฐฐ์—ด์„ ๋” ํฐ ํฌ๊ธฐ๋กœ ํ™•์žฅํ•˜๋ฉด์„œ ๋ชจ๋“  ์›์†Œ๋ฅผ ๋‹ค์‹œ ํ•ด์‹œํ•ด ์žฌ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ชจ๋“  iterator/ํฌ์ธํ„ฐ/์ฐธ์กฐ๊ฐ€ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค (vector ์žฌํ• ๋‹น๊ณผ ์œ ์‚ฌ).

๋Œ€๋น„์ฑ…์€ ๋ฏธ๋ฆฌ reserve(n)์„ ํ˜ธ์ถœํ•ด ์ถฉ๋ถ„ํ•œ ๋ฒ„ํ‚ท์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

ย set / mapunordered_set / unordered_map
์ž๋ฃŒ๊ตฌ์กฐRB-Treeํ•ด์‹œ ํ…Œ์ด๋ธ” + ์ฒด์ด๋‹
์ •๋ ฌO (์ž๋™)X
์กฐํšŒO(log n) ์ตœ์•…ํ‰๊ท  O(1), ์ตœ์•… O(n)
์‚ฝ์ž…/์‚ญ์ œO(log n) ์ตœ์•…ํ‰๊ท  O(1), ์ตœ์•… O(n)
๋ฒ”์œ„ ์กฐํšŒO (lower_bound)X
๋ฉ”๋ชจ๋ฆฌ๋…ธ๋“œ (3 ํฌ์ธํ„ฐ + ์ƒ‰)๋ฒ„ํ‚ท ๋ฐฐ์—ด + ๋…ธ๋“œ
iterator ์•ˆ์ •์„ฑ๊ฐ•ํ•จ (๋…ธ๋“œ)rehash ์‹œ ์ „์ฒด ๋ฌดํšจ

์‚ฌ์šฉ ๊ธฐ์ค€ ํ•œ ์ค„

  • map โ€” ํ‚ค ์ •๋ ฌยท๋ฒ”์œ„ ์กฐํšŒยทO(log n) ์ตœ์•… ๋ณด์žฅ์ด ํ•„์š”ํ•  ๋•Œ
  • unordered_map โ€” ์ˆœ์„œ ๋ฌด๊ด€ + ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ค‘์š”ํ•  ๋•Œ

6. ์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ โ€” stack / queue / priority_queue

ํ•ต์‹ฌ ํ•œ ๋ฌธ์žฅ

์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ๋Š” ๊ธฐ์กด ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ์‹ธ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œํ•œํ•œ ๋ž˜ํผ์ด๊ณ , ์ถ”์ƒ ์ž๋ฃŒ๊ตฌ์กฐ(LIFO/FIFO/ํž™)์˜ ์˜๋„๋ฅผ ์ฝ”๋“œ์— ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

6.1 std::stack โ€” LIFO

1
2
3
4
5
6
7
8
9
std::stack<int> s;            // ๊ธฐ๋ณธ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ = std::deque
s.push(1);
s.push(2);
s.push(3);
int top = s.top();            // 3
s.pop();                      // 3 ์ œ๊ฑฐ

// ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ ๋ช…์‹œ์  ์ง€์ •
std::stack<int, std::vector<int>> sv;
  • ์ธํ„ฐํŽ˜์ด์Šค: push, pop, top, size, empty (5๊ฐœ).
  • iterator ์—†์Œ โ€” LIFO ์˜๋ฏธ๋ฅผ ๊นจ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ์ œ์™ธ.
  • ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ ์š”๊ตฌ์‚ฌํ•ญ: back(), push_back(), pop_back() ์ง€์›ํ•˜๋ฉด ๋จ (vector, deque, list ๊ฐ€๋Šฅ).

6.2 std::queue โ€” FIFO

1
2
3
4
5
std::queue<int> q;            // ๊ธฐ๋ณธ = std::deque
q.push(1);
q.push(2);
int front = q.front();        // 1
q.pop();                      // 1 ์ œ๊ฑฐ
  • ์ธํ„ฐํŽ˜์ด์Šค: push, pop, front, back, size, empty.
  • ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ ์š”๊ตฌ์‚ฌํ•ญ: front(), back(), push_back(), pop_front() ํ•„์š”. ๊ทธ๋ž˜์„œ vector๋Š” ์•ˆ ๋˜๊ณ  deque / list๋งŒ ๊ฐ€๋Šฅ (vector๋Š” pop_front์ด ์—†์Œ).

6.3 std::priority_queue โ€” ์ด์ง„ ํž™

1
2
3
4
5
6
7
8
9
std::priority_queue<int> pq;  // ๊ธฐ๋ณธ = std::vector + std::less (์ตœ๋Œ€ ํž™)
pq.push(3);
pq.push(1);
pq.push(4);
int top = pq.top();           // 4 (์ตœ๋Œ“๊ฐ’)
pq.pop();                     // O(log n)

// ์ตœ์†Œ ํž™
std::priority_queue<int, std::vector<int>, std::greater<int>> minpq;
  • ์ž๋ฃŒ๊ตฌ์กฐ: ์ด์ง„ ํž™(binary heap). ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด 1๊ฐœ ์œ„์— ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ์ธ๋ฑ์Šค ์‚ฐ์ˆ ๋กœ ๊ด€๋ฆฌ(parent = (i-1)/2, left = 2i+1, right = 2i+2).
  • ์‹œ๊ฐ„ ๋ณต์žก๋„: top O(1), push/pop O(log n).
  • ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ ์š”๊ตฌ์‚ฌํ•ญ: front(), push_back(), pop_back() + ์ž„์˜ ์ ‘๊ทผ โ€” ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์€ vector. (deque๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ณดํ†ต vector๊ฐ€ ๋” ๋น ๋ฆ„.)

์–ด๋Œ‘ํ„ฐ vs ์ง์ ‘ ์‚ฌ์šฉ โ€” ์˜๋„๊ฐ€ ํ•ต์‹ฌ

1
2
3
4
5
6
7
8
9
10
11
// ์ฝ”๋“œ A โ€” ์˜๋„๊ฐ€ ๋ช…ํ™•
std::stack<int> s;
s.push(1);
s.push(2);
s.pop();

// ์ฝ”๋“œ B โ€” ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ์˜๋„ ๋ถˆ๋ช…ํ™•
std::deque<int> d;
d.push_back(1);
d.push_back(2);
d.pop_back();

์„ฑ๋Šฅ์€ ๊ฑฐ์˜ ๋™์ผํ•˜์ง€๋งŒ, A๋Š” โ€œ์ด๊ฑด LIFO๋‹คโ€๋ผ๋Š” ์˜๋„๋ฅผ ์ฝ”๋“œ ์ž์ฒด๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋Œ‘ํ„ฐ์˜ ๊ฐ€์žฅ ํฐ ๊ฐ€์น˜์ž…๋‹ˆ๋‹ค.


7. ์„ ํƒ ๊ธฐ์ค€ โ€” ์–ธ์ œ ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์“ฐ๋‚˜

1์ค„ ๊ฒฐ์ • ํŠธ๋ฆฌ

1
2
3
4
5
6
7
(1) ์ˆœ์„œ ๋ณด๊ด€ + ๋ ์œ„์ฃผ ์ถ”๊ฐ€/์ž„์˜ ์ ‘๊ทผ?         โ†’ vector
(2) ์–‘ ๋ ์ถ”๊ฐ€๊ฐ€ ์žฆ๋‹ค?                          โ†’ deque
(3) ๋งค์šฐ ํฐ ๊ฐ์ฒด + ์žฆ์€ ์ค‘๊ฐ„ splice?            โ†’ list
(4) ํ‚ค ์ •๋ ฌ + ๋ฒ”์œ„ ์กฐํšŒ + O(log n) ์ตœ์•… ๋ณด์žฅ?   โ†’ map / set
(5) ํ‚ค ์กฐํšŒ + ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰ (์ •๋ ฌ ๋ฌด๊ด€)?          โ†’ unordered_map / unordered_set
(6) ์ถ”์ƒ ์ž๋ฃŒ๊ตฌ์กฐ ์˜๋ฏธ๋งŒ ํ•„์š”?                  โ†’ stack / queue / priority_queue
(7) ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ณ ์ • ํฌ๊ธฐ?                      โ†’ array<T, N>

โ€œVector firstโ€ ๋ฃฐ

Stroustrup์ด ๊ฐ•์—ฐ์—์„œ ์ง์ ‘ ๋งํ•œ ๊ถŒ๊ณ :

โ€œUse std::vector. If in doubt, use std::vector anyway.โ€

์ด์œ :

  1. ์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ โ†’ ์บ์‹œ ์นœํ™”์„ฑ ์ตœ๊ฐ• โ†’ ๊ฑฐ์˜ ๋ชจ๋“  ์›Œํฌ๋กœ๋“œ์—์„œ ์••๋„์  ์„ฑ๋Šฅ.
  2. iterator ๋ฌดํšจํ™” ํ•จ์ •์ด ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ ์™ธ์—” ๋‹จ์ˆœํ•จ.
  3. ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋กœ ์˜ฎ๊ธธ ๋•Œ ๋น„์šฉ์ด ์ž‘์Œ.

๋ฉด์ ‘์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋‚˜์˜ค๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ 3์Œ

๋น„๊ต๊ฒฐ๋ก  ํ•œ ์ค„
vector vs list๊ฑฐ์˜ ํ•ญ์ƒ vector โ€” ์บ์‹œ ๋•Œ๋ฌธ์— ์ด๋ก ๊ณผ ์‹ค์ธก ์ •๋ฐ˜๋Œ€ (13๋ฒˆ)
map vs unordered_map์ •๋ ฌยท๋ฒ”์œ„ยท์ตœ์•…๋ณด์žฅ vs ํ‰๊ท  O(1) (14๋ฒˆ)
push_back vs emplace_back์ž„์‹œ ๊ฐ์ฒด ํšŒํ”ผ๊ฐ€ ์˜๋ฏธ ์žˆ์„ ๋•Œ๋งŒ emplace ์œ ๋ฆฌ (15๋ฒˆ)

8. iterator ๋ฌดํšจํ™” ๊ทœ์น™ ํ•œ๋ˆˆ์—

์ปจํ…Œ์ด๋„ˆ๋ณ„ ๋ฌดํšจํ™” ๊ทœ์น™

์ปจํ…Œ์ด๋„ˆ์‚ฝ์ž… ์‹œ ๋ฌดํšจํ™”์‚ญ์ œ ์‹œ ๋ฌดํšจํ™”
vector์žฌํ• ๋‹น ์‹œ ์ „์ฒด / ๊ทธ ์™ธ ์œ„์น˜ ์ดํ›„์œ„์น˜ ์ดํ›„ ๋ชจ๋‘
deque์–‘ ๋ ์™ธ ๋ชจ๋“  iterator ๋ฌดํšจ / ์–‘ ๋ push๋Š” iterator ๋ฌดํšจ, ํฌ์ธํ„ฐ/์ฐธ์กฐ๋Š” ์•ˆ์ „์–‘ ๋ ์™ธ ๋ชจ๋‘
list / forward_list๋ฌดํšจํ™” ์—†์Œ์‚ญ์ œ๋œ ๋…ธ๋“œ๋งŒ
set / map / multiset / multimap๋ฌดํšจํ™” ์—†์Œ์‚ญ์ œ๋œ ๋…ธ๋“œ๋งŒ
unordered_*rehash ์‹œ ์ „์ฒด / ๊ทธ ์™ธ ๋ฌดํšจํ™” ์—†์Œ์‚ญ์ œ๋œ ๋…ธ๋“œ๋งŒ
arrayโ€” (size ๊ณ ์ •)โ€”

ํ•ต์‹ฌ ํŒจํ„ด

  • ์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ ์ปจํ…Œ์ด๋„ˆ (vector, deque): ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žฌ๋ฐฐ์น˜๋˜๋Š” ์ˆœ๊ฐ„ iterator๊ฐ€ ํ†ต์งธ๋กœ ๊นจ์ง. capacity / rehash ๊ฐ€ ํ•จ์ •.
  • ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ (list, map, set): ๋…ธ๋“œ๊ฐ€ ํž™์— ๊ณ ์ • ์ฃผ์†Œ๋กœ ์‚ด์•„ ์žˆ์–ด์„œ ๋‹ค๋ฅธ iterator๋Š” ์•ˆ์ „. ์‚ญ์ œ๋œ ๋ณธ์ธ๋งŒ ๋ฌดํšจ.
  • ํ•ด์‹œ ์ปจํ…Œ์ด๋„ˆ (unordered_*): ํ‰์†Œ์—” ๋…ธ๋“œ ์•ˆ์ •์„ฑ์„ ๊ฐ–์ง€๋งŒ rehash ์‹œ ๋ชจ๋“  iterator ๋ฌดํšจํ™”. capacity ํ•จ์ •๊ณผ ๊ฐ™์€ ํŒจํ„ด.

์‹ค์ˆ˜ ์˜ˆ์‹œ

1
2
3
4
5
6
7
8
9
std::vector<int> v = {1, 2, 3};
auto it = v.begin();
v.push_back(4);              // ์žฌํ• ๋‹น ๊ฐ€๋Šฅ โ†’ it ๋ฌดํšจํ™” ์œ„ํ—˜!
std::cout << *it;            // โ† UB

// ์•ˆ์ „ํ•œ ํŒจํ„ด
v.reserve(100);              // ๋ฏธ๋ฆฌ capacity ํ™•๋ณด
auto it = v.begin();
v.push_back(4);              // ์žฌํ• ๋‹น ์•ˆ ๋จ โ†’ it ์•ˆ์ „

9. ํšŒ๊ท€ ๋‹ค๋ฆฌ โ€” ๋‹ค๋ฅธ CS ํŒŒ์ผ ์—ฐ๊ฒฐ

1
2
3
4
5
6
7
16. STL ์ปจํ…Œ์ด๋„ˆ ์ „๋ฐ˜
 โ”œโ”€โ”€ 13. vector vs list             โ€” ์‹œํ€€์Šค ๋ถ„๋ฅ˜ ๊นŠ์ด. ์บ์‹œ ์นœํ™”์„ฑยทiterator ๋ฌดํšจํ™” (โ˜…)
 โ”œโ”€โ”€ 14. std::map (RB-Tree)         โ€” ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ ๊นŠ์ด. 5์†์„ฑยทํšŒ์ „ยท์žฌ์ƒ‰์น 
 โ”œโ”€โ”€ 14 followup. map followup       โ€” multimapยทcustom compareยท๋ฒ”์œ„ ์กฐํšŒ
 โ”œโ”€โ”€ 15. push_back vs emplace_back  โ€” vector ๊ด€์šฉ๊ตฌ + ํ•ด์‹œ ์ถฉ๋Œ(์ฒด์ด๋‹/์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ)
 โ”œโ”€โ”€ 11. ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ               โ€” RAII + ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— unique_ptr ๋‹ด๊ธฐ
 โ””โ”€โ”€ 12. ๊ฐ์ฒด ๋ณต์‚ฌ ๊ธˆ์ง€              โ€” move-only ํƒ€์ž…์„ ์ปจํ…Œ์ด๋„ˆ์— ๋‹ด์„ ๋•Œ emplace ํ•„์ˆ˜

10. ๊ผฌ๋ฆฌ์งˆ๋ฌธ ์˜ˆ์ƒ ๊ฒฝ๋กœ

๋ฉ”์ธ ์งˆ๋ฌธ ๋‹ต๋ณ€ ํ›„ ์˜ˆ์ƒ ํ๋ฆ„

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
"STL ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”"
         โ”‚
         โ”œโ”€ 4๋ถ„๋ฅ˜ ๋‹ต๋ณ€
         โ”‚
         โ”œโ”€ ์‹œํ€€์Šค ๋ถ„๋ฅ˜
         โ”‚    โ”œโ”€ "vector vs list ์„ ํƒ ๊ธฐ์ค€?"  โ†’ 13๋ฒˆ
         โ”‚    โ”‚   โ””โ”€ "์ด๋ก  O(1)์ธ list๊ฐ€ ์™œ ์‹ค์ธก์—์„œ ๋А๋ฆฐ๊ฐ€์š”?" (์บ์‹œ ๋ผ์ธ)
         โ”‚    โ”œโ”€ "deque๋Š” vector๋ž‘ ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฐ€์š”?" (์ฒญํฌ + ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”)
         โ”‚    โ””โ”€ "array๋Š” C ๋ฐฐ์—ด๊ณผ ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฐ€์š”?" (size๊ฐ€ ํƒ€์ž…์˜ ์ผ๋ถ€)
         โ”‚
         โ”œโ”€ ์—ฐ๊ด€ ๋ถ„๋ฅ˜
         โ”‚    โ”œโ”€ "map ๋‚ด๋ถ€๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋ผ ์žˆ๋‚˜์š”?" โ†’ RB-Tree (14๋ฒˆ)
         โ”‚    โ”œโ”€ "AVL์ด ์•„๋‹ˆ๋ผ RB๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š”?" (ํšŒ์ „ ํšŸ์ˆ˜ ์ ์Œ โ†’ ์‚ฝ์ž…/์‚ญ์ œ ์œ ๋ฆฌ)
         โ”‚    โ””โ”€ "๋ฒ”์œ„ ์กฐํšŒ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?" (lower_bound / upper_bound)
         โ”‚
         โ”œโ”€ ๋น„์ˆœ์„œ ์—ฐ๊ด€ ๋ถ„๋ฅ˜
         โ”‚    โ”œโ”€ "map vs unordered_map?" โ†’ 14๋ฒˆ
         โ”‚    โ”œโ”€ "ํ•ด์‹œ ์ถฉ๋Œ์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋‚˜์š”?" โ†’ 15๋ฒˆ (์ฒด์ด๋‹, STL ์ฑ„ํƒ)
         โ”‚    โ”‚   โ””โ”€ "์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ์€ ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฐ€์š”?" (ํƒ์‚ฌ ์ „๋žต, Robin Hood)
         โ”‚    โ””โ”€ "rehash๋Š” ์–ธ์ œ ์ผ์–ด๋‚˜๋‚˜์š”?" (load_factor > max_load_factor)
         โ”‚
         โ”œโ”€ ์–ด๋Œ‘ํ„ฐ ๋ถ„๋ฅ˜
         โ”‚    โ”œโ”€ "stack์˜ ๊ธฐ๋ณธ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋Š”?" (deque)
         โ”‚    โ”œโ”€ "์™œ vector๊ฐ€ ์•„๋‹ˆ๋ผ deque?" (vector๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์–‘ ๋ push์—์„œ ์œ ๋ฆฌ)
         โ”‚    โ””โ”€ "priority_queue์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋Š”?" (์ด์ง„ ํž™, ๋ฐฐ์—ด ์œ„ ๊ตฌํ˜„)
         โ”‚
         โ””โ”€ ํ•จ์ • โ€” iterator ๋ฌดํšจํ™”
              โ”œโ”€ "vector์—์„œ push_back ํ›„ iterator๋Š”?" (์žฌํ• ๋‹น ์‹œ ๋ฌดํšจ)
              โ”‚   โ””โ”€ "์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€?" (reserve ๋ฏธ๋ฆฌ ํ˜ธ์ถœ)
              โ”œโ”€ "map์—์„œ erase ํ›„ ๋‹ค๋ฅธ iterator๋Š”?" (์‚ญ์ œ๋œ ๋…ธ๋“œ๋งŒ ๋ฌดํšจ)
              โ””โ”€ "unordered_map rehash ์‹œ?" (์ „์ฒด ๋ฌดํšจ โ€” vector์™€ ๋™์ผ)

๊ฐ ๊ผฌ๋ฆฌ์งˆ๋ฌธ 30์ดˆ ๋‹ต๋ณ€

Q: vector capacity์™€ size ์ฐจ์ด?

1
2
3
size      โ€” ์‹ค์ œ ์›์†Œ ์ˆ˜. v[i]์˜ i๊ฐ€ size๋ฅผ ๋„˜์œผ๋ฉด UB.
capacity  โ€” ํ• ๋‹น๋œ ์Šฌ๋กฏ ์ˆ˜. ์žฌํ• ๋‹น ์—†์ด push_back ๊ฐ€๋Šฅํ•œ ํ•œ๊ณ„.
reserve(n) โ€” capacity๋งŒ ๋Š˜๋ฆผ. size๋Š” ๊ทธ๋Œ€๋กœ.

Q: deque๋Š” ์–ด๋–ป๊ฒŒ ์–‘ ๋ push๊ฐ€ O(1)์ธ๊ฐ€?

1
2
3
4
์ฒญํฌ(๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด)๋“ค์„ ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”(๋งต)์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ตฌ์กฐ.
์•ž/๋’ค ์ฒญํฌ์— ๋นˆ ์Šฌ๋กฏ์ด ์žˆ์œผ๋ฉด ๊ทธ ์Šฌ๋กฏ์— ์‚ฝ์ž… โ€” O(1).
์ฒญํฌ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด ์ƒˆ ์ฒญํฌ ํ• ๋‹น + ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ” ๋์— ํฌ์ธํ„ฐ ์ถ”๊ฐ€ โ€” amortized O(1).
์ค‘์š”: vector์ฒ˜๋Ÿผ ๋ชจ๋“  ์›์†Œ๋ฅผ ์˜ฎ๊ธฐ์ง€ ์•Š์Œ. ๊ทธ๋ž˜์„œ iterator๋Š” ์–‘ ๋์—์„œ ๋ฌดํšจํ™”.

Q: priority_queue ๋‚ด๋ถ€ ์ž๋ฃŒ๊ตฌ์กฐ?

1
2
3
4
5
์ด์ง„ ํž™(binary heap) โ€” ๋ฐฐ์—ด 1๊ฐœ ์œ„์— ๋ถ€๋ชจ-์ž์‹ ์ธ๋ฑ์Šค ์‚ฐ์ˆ ๋กœ ๊ตฌํ˜„.
parent = (i-1)/2, left = 2i+1, right = 2i+2.
push: ๋์— ์ถ”๊ฐ€ โ†’ up-heap (๋ถ€๋ชจ์™€ ๋น„๊ตํ•˜๋ฉฐ ์˜ฌ๋ผ๊ฐ) โ€” O(log n)
pop:  ๋ฃจํŠธ ์ œ๊ฑฐ โ†’ ๋ ์›์†Œ๋ฅผ ๋ฃจํŠธ๋กœ โ†’ down-heap โ€” O(log n)
top:  ๋ฃจํŠธ (๋ฐฐ์—ด [0]) โ€” O(1)

Q: stack๊ณผ queue์˜ ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ deque์ธ ์ด์œ ?

1
2
3
4
stack์€ ๋ ์ถ”๊ฐ€/์‚ญ์ œ๋งŒ โ†’ vector๋„ ๊ฐ€๋Šฅ.
queue๋Š” ์•ž ์‚ญ์ œ + ๋’ค ์ถ”๊ฐ€ โ†’ vector๋Š” pop_front๊ฐ€ ์—†์–ด์„œ ๋ถˆ๊ฐ€.
๊ทธ๋ž˜์„œ ๋‘˜ ๋‹ค ๋งŒ์กฑํ•˜๋Š” deque๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ†ต์ผ.
deque๋Š” ์–‘ ๋ push/pop์ด O(1)์ด๊ณ  ์ค‘๊ฐ„ ์žฌํ• ๋‹น์ด ์—†์–ด์„œ ์–ด๋Œ‘ํ„ฐ์— ์ ํ•ฉ.

Q: forward_list๊ฐ€ size()๋ฅผ ์•ˆ ๊ฐ€์ง€๋Š” ์ด์œ ?

1
2
3
size๋ฅผ O(1)๋กœ ๊ตฌํ•˜๋ ค๋ฉด size ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋ณ„๋„๋กœ ์œ ์ง€ํ•ด์•ผ ํ•จ โ†’ ๋…ธ๋“œ๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ ํšจ๊ณผ ์ƒ์‡„.
forward_list๋Š” "๋ฉ”๋ชจ๋ฆฌ ๊ทน๋‹จ ์ ˆ์•ฝ"์ด ๋ชฉ์ ์ด๋ผ ํ‘œ์ค€์ด ์ผ๋ถ€๋Ÿฌ size๋ฅผ ๋นผ๊ณ  distance(begin, end)๋กœ O(n) ๊ณ„์‚ฐํ•˜๋„๋ก ๊ฒฐ์ •.
๋Œ€์‹  splice ๊ฐ™์€ ๋…ธ๋“œ ์žฌ๋ฐฐ์น˜ ์—ฐ์‚ฐ์ด ๋” ๋‹จ์ˆœํ•จ (size ๊ฐฑ์‹  ๋ถ€๋‹ด ์—†์Œ).

Q: array๋Š” C ๋ฐฐ์—ด๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€?

1
2
3
4
5
6
C ๋ฐฐ์—ด       โ€” ํ•จ์ˆ˜ ์ธ์ž๋กœ ์ „๋‹ฌ ์‹œ ํฌ์ธํ„ฐ๋กœ decay. size ์ •๋ณด ์†์‹ค.
std::array   โ€” size๊ฐ€ ํƒ€์ž…์˜ ์ผ๋ถ€ (std::array<int, 4>). ๊ฐ’์œผ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ.
              ํ‘œ์ค€ ์ปจํ…Œ์ด๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค (begin, end, size, swap, fill).
              range-for ๋™์ž‘.
              ์Šคํƒ์— ์žกํžˆ๊ณ  ๋™์  ํ• ๋‹น ์—†์Œ.
์šฉ๋„         โ€” ์ปดํŒŒ์ผ ํƒ€์ž„์— ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ง„ ์ž‘์€ ๋ฐฐ์—ด (์ขŒํ‘œ, ํ–‰๋ ฌ, ์ƒ‰์ƒ).

11. ์–ธ๋ฆฌ์–ผ์—์„œ์˜ STL ์ปจํ…Œ์ด๋„ˆ ๋Œ€์‘

์–ธ๋ฆฌ์–ผ์€ STL ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง์ ‘ ์“ฐ์ง€ ์•Š๊ณ  ์ž์ฒด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š” GC ํ†ตํ•ฉ / UPROPERTY ๋ฆฌํ”Œ๋ ‰์…˜ / ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž ํ†ตํ•ฉ / ์บ์‹œ ์นœํ™”์„ฑ์ž…๋‹ˆ๋‹ค.

๋Œ€์‘ ํ‘œ

STLUnreal๋น„๊ณ 
std::vectorTArray<T>1๊ธ‰ ์‹œ๋ฏผ. UPROPERTY ํ†ตํ•ฉ
std::array<T, N>TStaticArray<T, N>๊ณ ์ • ํฌ๊ธฐ
std::listTLinkedList, TDoubleLinkedList1๊ธ‰์ด ์•„๋‹Œ ํ—ฌํผ ์ˆ˜์ค€
std::deque(์ง์ ‘ ๋Œ€์‘ ์—†์Œ)TArray + ์ธ๋ฑ์Šค๋กœ ๋Œ€์ฒด
std::setTSet<T>ํ•ด์‹œ ๊ธฐ๋ฐ˜ (RB-Tree ์•„๋‹˜!)
std::map(์ง์ ‘ ๋Œ€์‘ ์—†์Œ)RB-Tree map์€ ์˜๋„์ ์œผ๋กœ ๋ฏธ์ œ๊ณต
std::unordered_mapTMap<K, V>ํ•ด์‹œ ๊ธฐ๋ฐ˜ + ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ โ˜…
std::unordered_multimapTMultiMap<K, V>ํ‚ค ์ค‘๋ณต ํ—ˆ์šฉ
(์ •๋ ฌ๋œ map์ด ํ•„์š”ํ•  ๋•Œ)TSortedMap<K, V>์ •๋ ฌ๋œ ๋ฐฐ์—ด โ€” RB-Tree ์•„๋‹˜
std::stack(์ง์ ‘ ๋Œ€์‘ ์—†์Œ)TArray + Push/Pop
std::queueTQueue<T>thread-safe SPSC ํ
std::priority_queueTBinaryHeap<T> (Algo ๋„ค์ž„์ŠคํŽ˜์ด์Šค)์ด์ง„ ํž™

๊ฐ€์žฅ ํฐ ๊ตฌ์กฐ์  ์ฐจ์ด โ€” TMap์˜ ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ

STL unordered_map์€ ์ถฉ๋Œ์„ ์ฒด์ด๋‹(์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)์œผ๋กœ ํ•ด๊ฒฐํ•˜์ง€๋งŒ, ์–ธ๋ฆฌ์–ผ TMap์€ ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ย STL unordered_mapUnreal TMap
์ถฉ๋Œ ์ฒ˜๋ฆฌ์ฒด์ด๋‹ (์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ (ํƒ์‚ฌ)
๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ๋ฒ„ํ‚ท + ๋ถ„์‚ฐ ๋…ธ๋“œ์—ฐ์† ๋ฐฐ์—ด
์บ์‹œ ์นœํ™”์„ฑ๋ณดํ†ต์ข‹์Œ (์—ฐ์†)
๋…ธ๋“œ ์•ˆ์ •์„ฑ๊ฐ•ํ•จrehash ์‹œ ์ „์ฒด ์ด๋™
iterator ๋ฌดํšจํ™”rehash ์‹œrehash + ์‚ฝ์ž…/์‚ญ์ œ ์‹œ

๊ฒŒ์ž„ ์—”์ง„์€ ์บ์‹œ ์นœํ™”์„ฑ์„ ์šฐ์„ ํ•˜๋ฏ€๋กœ ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •๋ ฌ ํŠธ๋ฆฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†๋Š” ์ด์œ 

์–ธ๋ฆฌ์–ผ์—๋Š” std::map (RB-Tree) ๋Œ€์‘ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜๋„์ ์œผ๋กœ ์—†์Šต๋‹ˆ๋‹ค.

  • RB-Tree๋Š” ๋…ธ๋“œ ๋ถ„์‚ฐ ํ• ๋‹น์ด๋ผ ์บ์‹œ ์นœํ™”์„ฑ์ด ๋‚˜์จ.
  • ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋ฉด TArray + Algo::Sort ๋˜๋Š” TSortedMap (์ •๋ ฌ๋œ ๋ฐฐ์—ด).
  • ๊ฒŒ์ž„ ์—”์ง„ ์›Œํฌ๋กœ๋“œ์—์„œ O(log n) ํŠธ๋ฆฌ๋ณด๋‹ค ์บ์‹œ ์นœํ™”์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๊ฑฐ์˜ ํ•ญ์ƒ ๋” ๋น ๋ฆ„.

12. ๋ชจ์˜๋ฉด์ ‘ ๋‹ต๋ณ€ ํ…œํ”Œ๋ฆฟ (1๋ถ„ / 3๋ถ„)

1๋ถ„ ๋ฒ„์ „

1
2
3
4
5
6
7
8
STL ์ปจํ…Œ์ด๋„ˆ๋Š” 4๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

(1) ์‹œํ€€์Šค โ€” ์‚ฝ์ž… ์ˆœ์„œ ๋ณด๊ด€: vector(์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ, ์บ์‹œ ์ตœ๊ฐ•), deque(์ฒญํฌ), list(์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ), forward_list, array.
(2) ์—ฐ๊ด€ โ€” RB-Tree ์ •๋ ฌ: set/map (+ multi ๋ฒ„์ „). ๋ชจ๋“  ์—ฐ์‚ฐ O(log n) ์ตœ์•… ๋ณด์žฅ, ๋ฒ”์œ„ ์กฐํšŒ ๊ฐ€๋Šฅ.
(3) ๋น„์ˆœ์„œ ์—ฐ๊ด€ โ€” ํ•ด์‹œ ํ…Œ์ด๋ธ”: unordered_set/map. ํ‰๊ท  O(1), ์ตœ์•… O(n), STL์€ ์ฒด์ด๋‹์œผ๋กœ ์ถฉ๋Œ ํ•ด๊ฒฐ.
(4) ์–ด๋Œ‘ํ„ฐ โ€” ์ธํ„ฐํŽ˜์ด์Šค ๋ž˜ํผ: stack(LIFO), queue(FIFO), priority_queue(์ด์ง„ ํž™). ๊ธฐ๋ณธ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋Š” stack/queue=deque, priority_queue=vector.

์„ ํƒ ๊ธฐ์ค€์€ ์˜์‹ฌ์Šค๋Ÿฌ์šฐ๋ฉด vector, ํ‚ค ์ •๋ ฌยท์ตœ์•… ๋ณด์žฅ์ด ํ•„์š”ํ•˜๋ฉด map, ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํ•„์š”ํ•˜๋ฉด unordered_map์ž…๋‹ˆ๋‹ค.

3๋ถ„ ๋ฒ„์ „

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
STL ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹œํ€€์Šค, ์—ฐ๊ด€, ๋น„์ˆœ์„œ ์—ฐ๊ด€, ์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ 4๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

(1) ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ๋Š” ์›์†Œ๋ฅผ ์‚ฝ์ž… ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
    vector๋Š” ์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ ๋™์  ๋ฐฐ์—ด๋กœ ์ž„์˜ ์ ‘๊ทผ O(1), ๋ push๋Š” amortized O(1)์ด๊ณ  ์บ์‹œ ์นœํ™”์„ฑ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.
    deque๋Š” ์ฒญํฌ ๊ธฐ๋ฐ˜ ๋”๋ธ”์—”๋“œ ํ๋กœ ์–‘ ๋ push๊ฐ€ O(1)์ด์ง€๋งŒ vector๋ณด๋‹ค ์บ์‹œ ํšจ์œจ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.
    list๋Š” ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, forward_list๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฆฌ์ŠคํŠธ๋กœ ๋…ธ๋“œ๊ฐ€ ํž™์— ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
    array๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด๋กœ size๊ฐ€ ํƒ€์ž…์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

(2) ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ‚ค ๊ธฐ์ค€ ์ž๋™ ์ •๋ ฌ๋˜๋ฉฐ ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌํ˜„์ด Red-Black Tree์ž…๋‹ˆ๋‹ค.
    set/map์€ ํ‚ค ์ค‘๋ณต ๋ถˆ๊ฐ€, multiset/multimap์€ ๊ฐ€๋Šฅ. ๋ชจ๋“  ์—ฐ์‚ฐ O(log n) ์ตœ์•… ๋ณด์žฅ์ด๊ณ  lower_bound๋กœ ๋ฒ”์œ„ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

(3) ๋น„์ˆœ์„œ ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค.
    unordered_set/map์ด ๋Œ€ํ‘œ์ด๊ณ  ํ‰๊ท  O(1) ์กฐํšŒ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ์ •๋ ฌ์ด ์•ˆ ๋˜๊ณ  ์ตœ์•…์€ O(n)์ž…๋‹ˆ๋‹ค.
    STL์€ ์ถฉ๋Œ์„ ์ฒด์ด๋‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  ๋กœ๋“œ ํŒฉํ„ฐ ํ•œ๊ณ„ ์ดˆ๊ณผ ์‹œ rehash๊ฐ€ ์ผ์–ด๋‚˜๋ฉด์„œ ๋ชจ๋“  iterator๊ฐ€ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.

(4) ์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ๋Š” ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ์‹ผ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค.
    stack์€ LIFO, queue๋Š” FIFO๋กœ ๊ธฐ๋ณธ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ deque์ด๊ณ , priority_queue๋Š” ์ด์ง„ ํž™์œผ๋กœ ๊ธฐ๋ณธ์€ vector + make_heap ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.

์„ ํƒ ๊ธฐ์ค€์€ ์˜์‹ฌ์Šค๋Ÿฌ์šฐ๋ฉด vector, ํ‚ค ์ •๋ ฌยทO(log n) ์ตœ์•… ๋ณด์žฅ์ด ํ•„์š”ํ•˜๋ฉด map, ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํ•„์š”ํ•˜๋ฉด unordered_map, ์ถ”์ƒ ์ž๋ฃŒ๊ตฌ์กฐ ์˜๋ฏธ๋งŒ ํ•„์š”ํ•˜๋ฉด ์–ด๋Œ‘ํ„ฐ์ž…๋‹ˆ๋‹ค. ๋ฉด์ ‘ ๋‹จ๊ณจ ํ•จ์ •์€ vector vs list (์ด๋ก ๊ณผ ์‹ค์ธก์ด ์ •๋ฐ˜๋Œ€), map vs unordered_map (์ •๋ ฌ vs ์ฒ˜๋ฆฌ๋Ÿ‰), vector ์žฌํ• ๋‹น ์‹œ iterator ์ „์ฒด ๋ฌดํšจํ™” ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์–ธ๋ฆฌ์–ผ์—์„œ๋Š” TArray๊ฐ€ vector ๋Œ€์‘์œผ๋กœ 1๊ธ‰ ์‹œ๋ฏผ์ด๊ณ , TMap์€ unordered_map ๋Œ€์‘์ด์ง€๋งŒ ์ถฉ๋Œ์„ ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. RB-Tree map ๋Œ€์‘์€ ์˜๋„์ ์œผ๋กœ ์—†๊ณ , ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋ฉด TSortedMap (์ •๋ ฌ๋œ ๋ฐฐ์—ด)์„ ์”๋‹ˆ๋‹ค. ์บ์‹œ ์นœํ™”์„ฑ์„ ๊ฒŒ์ž„ ์—”์ง„์ด ์šฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ 

  • 13_vector_vs_list.md โ€” ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ + ์บ์‹œ ์นœํ™”์„ฑ ๊นŠ์ด
  • 14_std_map.md โ€” RB-Tree 5์†์„ฑ + ํšŒ์ „ + ์žฌ์ƒ‰์น 
  • 14_std_map_followup.md โ€” map ๋ชจ์˜๋ฉด์ ‘ ๊ผฌ๋ฆฌ๋ฌผ๊ธฐ 16๊ฐœ
  • 15_pushback_vs_emplaceback.md โ€” vector capacity + ํ•ด์‹œ ์ถฉ๋Œ(์ฒด์ด๋‹/์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ)
  • 11_smart_pointer.md โ€” ์ปจํ…Œ์ด๋„ˆ์— unique_ptr ๋‹ด์„ ๋•Œ emplace ํ•„์ˆ˜
  • 12_prevent_copy.md โ€” move-only ํƒ€์ž…๊ณผ ์ปจํ…Œ์ด๋„ˆ
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

ยฉ GoldBoll. ์ผ๋ถ€ ๊ถŒ๋ฆฌ ๋ณด์œ 

Powered by Jekyll with Chirpy theme

์ธ๊ธฐ ํƒœ๊ทธ