๐ 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 Container | RB-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::map | RB-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::stack | LIFO. ๊ธฐ๋ณธ ๋ด๋ถ ์ปจํ
์ด๋ = deque |
| ย | std::queue | FIFO. ๊ธฐ๋ณธ ๋ด๋ถ ์ปจํ
์ด๋ = 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 ์ง์ | ์๋ ํํ์ด ํต์ฌ. ์ฑ๋ฅ์ ๋์ผ |
๋ชฉ์ฐจ
- ํต์ฌ ์์ฝ ์นด๋
- STL ์ปจํ
์ด๋ 4๋ ๋ถ๋ฅ
- ์ํ์ค ์ปจํ
์ด๋ โ vector / deque / list / forward_list / array
- ์ฐ๊ด ์ปจํ
์ด๋ โ set / multiset / map / multimap (RB-Tree)
- ๋น์์ ์ฐ๊ด ์ปจํ
์ด๋ โ unordered_set / unordered_map (ํด์)
- ์ปจํ
์ด๋ ์ด๋ํฐ โ stack / queue / priority_queue
- ์ ํ ๊ธฐ์ค โ ์ธ์ ์ด๋ค ์ปจํ
์ด๋๋ฅผ ์ฐ๋
- iterator ๋ฌดํจํ ๊ท์น ํ๋์
- ํ๊ท ๋ค๋ฆฌ โ ๋ค๋ฅธ CS ํ์ผ ์ฐ๊ฒฐ
- ๊ผฌ๋ฆฌ์ง๋ฌธ ์์ ๊ฒฝ๋ก
- ์ธ๋ฆฌ์ผ์์์ STL ์ปจํ
์ด๋ ๋์
- ๋ชจ์๋ฉด์ ๋ต๋ณ ํ
ํ๋ฆฟ (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 ์์ ์ฑ |
|---|
vector | O(1) | amortized O(1) | O(n) | O(n) | O(n) | ์๋ | ์ฝํจ (์ฌํ ๋น) |
deque | O(1) | O(1) | O(1) | O(n) | O(n) | ์๋ | ์ฝํจ |
list | O(n) | O(1) | O(1) | O(1) (์์น ์ ๋) | O(n) | ๋ฉค๋ฒ sort | ๊ฐํจ (๋
ธ๋) |
forward_list | O(n) | โ | O(1) | O(1) | O(n) | ๋ฉค๋ฒ sort | ๊ฐํจ |
array | O(1) | โ | โ | โ | O(n) | ์๋ | ๊ฐํจ |
set/map | O(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_queue | top 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
โ ๋ฅผ ๊ฐ์ผ ์ธํฐํ์ด์คโ
โโโโโโโโโโโโโโโโโโโโ
|
ํ์ค ํค๋์ ๋์
์์
| ๋ถ๋ฅ | ์ปจํ
์ด๋ | ํค๋ | ๋์
|
|---|
| Sequence | vector | <vector> | C++98 |
| ย | deque | <deque> | C++98 |
| ย | list | <list> | C++98 |
| ย | forward_list | <forward_list> | C++11 |
| ย | array<T, N> | <array> | C++11 |
| Associative | set / multiset | <set> | C++98 |
| ย | map / multimap | <map> | C++98 |
| Unordered | unordered_set / multiset | <unordered_set> | C++11 |
| ย | unordered_map / multimap | <unordered_map> | C++11 |
| Adapter | stack | <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 ๋์. - ์ฌ์ฉ ์ผ์ด์ค: ํฌ๊ธฐ๊ฐ ์ปดํ์ผ ํ์์ ๊ณ ์ ๋ ์์ ๋ฐฐ์ด. ๊ฒ์์์ ์ขํยทํ๋ ฌ ๊ฐ์ ๊ฒ.
์ํ์ค ์ปจํ
์ด๋ ๋น๊ต ์์ฝ
| ย | vector | deque | list | forward_list | array<T,N> |
|---|
| ๋ฉ๋ชจ๋ฆฌ | ์ฐ์ 1๋ธ๋ก | ์ฒญํฌ + ํ
์ด๋ธ | ๋
ธ๋ ๋ถ์ฐ | ๋
ธ๋ ๋ถ์ฐ | ์ฐ์ (์คํ) |
| ์์ ์ ๊ทผ | O(1) | O(1) | O(n) | O(n) | O(1) |
| ๋ push | amortized O(1) | O(1) | O(1) | โ | ๋ถ๊ฐ |
| ์ push | O(n) | O(1) | O(1) | O(1) | โ |
| ์บ์ ์นํ์ฑ | โ
โ
โ
โ
โ
| โ
โ
โ
| โ
| โ
| โ
โ
โ
โ
โ
|
| iterator ์์ ์ฑ | ์ฝํจ | ์ฝํจ | ๊ฐํจ | ๊ฐํจ | ๊ฐํจ (๊ณ ์ ) |
| ๋์ size | O | O | O | O | X (๊ณ ์ ) |
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) ์ผ๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋ชจ๋ ๋
ธ๋๋ ๋นจ๊ฐ ๋๋ ๊ฒ์
- ๋ฃจํธ๋ ๊ฒ์
- ๋ชจ๋ NIL(๋ฆฌํ)์ ๊ฒ์
- ๋นจ๊ฐ ๋
ธ๋์ ์์์ ๋ฐ๋์ ๊ฒ์ (๋นจ๊ฐ ์ฐ์ ๊ธ์ง)
- ์์ ๋
ธ๋ โ 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 / map | unordered_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.โ
์ด์ :
- ์ฐ์ ๋ฉ๋ชจ๋ฆฌ โ ์บ์ ์นํ์ฑ ์ต๊ฐ โ ๊ฑฐ์ ๋ชจ๋ ์ํฌ๋ก๋์์ ์๋์ ์ฑ๋ฅ.
- iterator ๋ฌดํจํ ํจ์ ์ด ์์ง๋ง, ๊ทธ๊ฒ ์ธ์ ๋จ์ํจ.
- ๋ค๋ฅธ ์ปจํ
์ด๋๋ก ์ฎ๊ธธ ๋ ๋น์ฉ์ด ์์.
๋ฉด์ ์์ ๊ฐ์ฅ ์์ฃผ ๋์ค๋ ํธ๋ ์ด๋์คํ 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 ๋ฆฌํ๋ ์
/ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํตํฉ / ์บ์ ์นํ์ฑ์
๋๋ค.
๋์ ํ
| STL | Unreal | ๋น๊ณ |
|---|
std::vector | TArray<T> | 1๊ธ ์๋ฏผ. UPROPERTY ํตํฉ |
std::array<T, N> | TStaticArray<T, N> | ๊ณ ์ ํฌ๊ธฐ |
std::list | TLinkedList, TDoubleLinkedList | 1๊ธ์ด ์๋ ํฌํผ ์์ค |
std::deque | (์ง์ ๋์ ์์) | TArray + ์ธ๋ฑ์ค๋ก ๋์ฒด |
std::set | TSet<T> | ํด์ ๊ธฐ๋ฐ (RB-Tree ์๋!) |
std::map | (์ง์ ๋์ ์์) | RB-Tree map์ ์๋์ ์ผ๋ก ๋ฏธ์ ๊ณต |
std::unordered_map | TMap<K, V> | ํด์ ๊ธฐ๋ฐ + ์คํ ์ด๋๋ ์ฑ โ
|
std::unordered_multimap | TMultiMap<K, V> | ํค ์ค๋ณต ํ์ฉ |
| (์ ๋ ฌ๋ map์ด ํ์ํ ๋) | TSortedMap<K, V> | ์ ๋ ฌ๋ ๋ฐฐ์ด โ RB-Tree ์๋ |
std::stack | (์ง์ ๋์ ์์) | TArray + Push/Pop |
std::queue | TQueue<T> | thread-safe SPSC ํ |
std::priority_queue | TBinaryHeap<T> (Algo ๋ค์์คํ์ด์ค) | ์ด์ง ํ |
๊ฐ์ฅ ํฐ ๊ตฌ์กฐ์ ์ฐจ์ด โ TMap์ ์คํ ์ด๋๋ ์ฑ
STL unordered_map์ ์ถฉ๋์ ์ฒด์ด๋(์ฐ๊ฒฐ ๋ฆฌ์คํธ)์ผ๋ก ํด๊ฒฐํ์ง๋ง, ์ธ๋ฆฌ์ผ TMap์ ์คํ ์ด๋๋ ์ฑ์ ์ฌ์ฉํฉ๋๋ค.
| ย | STL unordered_map | Unreal 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 (์ ๋ ฌ๋ ๋ฐฐ์ด)์ ์๋๋ค. ์บ์ ์นํ์ฑ์ ๊ฒ์ ์์ง์ด ์ฐ์ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
|
์ฐธ๊ณ