[GP] C++์—์„œ Map์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

๋ฐ˜์‘ํ˜•

์ด ๊ธ€์€ N.K Dev Lab์—์„œ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ C++ STL์— ๋Œ€ํ•œ ๊ธ€์„ ์จ๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ๋ž˜ ์ €๋Š” STL๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ๊ธ€์€ ์ž˜ ์“ฐ์ง€ ์•Š์œผ๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค. ์›Œ๋‚™ Documentation๋„ ์ž˜ ๋˜์–ด ์žˆ๋Š” ํŽธ์ด๊ณ , ๋ธ”๋กœ๊ทธ์˜ ๊ธ€ ์ฃผ์ œ๋กœ ์“ฐ๊ธฐ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์˜ค๋Š˜ ์ด ๊ธ€์„ ์“ฐ๊ฒŒ ๋œ ๊ณ„๊ธฐ๋Š” ์ œ๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด๋ฅผ ๋ช‡ ๋ฒˆ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ œ๊ฐ€ ์ฃผ๋กœ ์“ฐ๊ณ  ์žˆ๋Š” Java ์–ธ์–ด์™€ ๋‹ค์†Œ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ์ด ๋œ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋ช‡ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ ์–ธ์–ด์—์„œ ๋น„์Šทํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํ˜•ํƒœ๊ฐ€ STL์ด๋‚˜ API๋กœ ์ง€์›๋œ๋‹คํ•˜๋”๋ผ๋„ ์–ธ์–ด์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ๊ฐ ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋Š” ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.


What is STL ?

STL์€ C++์—์„œ ์ œ๊ณตํ•˜๋Š” Standard Template Library์ž…๋‹ˆ๋‹ค. C++ ์–ธ์–ด๋Š” ๊ธฐ์กด์˜ C์–ธ์–ด์—์„œ ํด๋ž˜์Šค๋‚˜ ์ƒ์†, ์ ‘๊ทผ ์ง€์ •์ž ๋“ฑ์ด ์ถ”๊ฐ€๋œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ผ๊ณ  ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋Ÿฐ ์ข‹์€ ๊ธฐ๋Šฅ + ํ‘œ์ค€ ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ €๋Š” C++ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ–ˆ์„ ๋•Œ STL๋ณด๋‹ค๋Š” Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” C++ ์–ธ์–ด๋กœ ์ œ๊ณต๋˜๋Š” ๋ถ€๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋กœ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์œ ์šฉํ•œ Asio ๋“ฑ์„ ์ œ๊ณตํ•˜์—ฌ C++๋ฅผ ์‰ฝ๊ณ  ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ํ‘œํ˜„ํ•ด์ฃผ๋Š” ์•„์ฃผ ์šฐ์ˆ˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

๋”์šฑ ์ข‹์€ ๊ฒƒ์€ Boost์—์„œ ์ œ๊ณตํ•˜๋Š” ์‹œ์Šคํ…œ ์ž์› (Thread, Semapore ๋“ฑ)์„ System Call ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ Library Call ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•˜์—ฌ Linux, Windows ๋“ฑ์˜ OS์˜ ์ œ์•ฝ์—†์ด ํฌ๋กœ์Šค ํ”Œ๋žซํผ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ํ•œ๋ชซํ•˜๊ณ  ์žˆ์ฃ .

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ๋ชจ๋‘ 3rd party ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ํ•ด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ฐœ๋ฐœ์‚ฌ์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ œ3์ž๊ฐ€ ๊ฐœ๋ฐœํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๊ธฐ๋Šฅ์ด ์˜จ์ „ํ•˜๊ฑฐ๋‚˜ ์ธ์ฆ๋ฐ›์€ ์ฝ”๋“œ๋ผ๊ณ  ํ•˜๊ธฐ์—” ์กฐ๊ธˆ ๊ฑฐ๋ฆฌ๊ฐ€ ๋จผ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ‘œ์ค€์œผ๋กœ ์ธ์ฆ๋ฐ›์€ ๋ชจ์Œ์ง‘์„ STL์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Container

์ปจํ…Œ์ด๋„ˆ๋Š” STL์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด (์ž๋ฃŒ๊ตฌ์กฐ) ๋“ค์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ์ €๋Š” vector, pair, list, map, stack, queue๋ฅผ ์ฃผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” map์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


Map

์ž๋ฃŒ๊ตฌ์กฐ ๋งต(Map)์€ <Key, Value> ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋งคํ•‘ํ•˜๋Š” ์šฉ๋„๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋ฉฐ ์ •๋ ฌ๋œ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค. Key ๊ฐ’์„ ์ฐพ์„ ๋•Œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)์„ ์ž๋ž‘ํ•  ์ •๋„๋กœ ๋งค์šฐ ์„ฑ๋Šฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
#include <map>

using std::map;

int main(int argc, char **argv)
{
map<int, int> map;

return 0;
}

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋จผ์ € map ์ฝ”๋“œ๋ฅผ includeํ•˜๊ณ , ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฃฐ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž์‹ ์ด ์›ํ•˜๋Š” <Key, Value> ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ณ  ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์„ ์–ธํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ Map ์ƒ์„ฑ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Key Point

Map์„ ์‚ฌ์šฉํ•˜๋Š” ํฌ์ธํŠธ๋Š” ๋ฐ”๋กœ ์ขŒํ‘œ ์ง€์ ์„ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Pair๋‚˜ Point์˜ ์ž๋ฃŒ๋ฅผ ๋ณด๊ด€ํ•  ๋•Œ ๋งค์šฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Map ์—ญ์‹œ 2์ฐจ์› ๋ฐฐ์—ด์ฒ˜๋Ÿผ 2์ฐจ์› Map์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ž๋ฃŒ๋“ค์„ ๋ณด๊ด€ํ•˜๊ณ  ์‰ฝ๊ฒŒ ๊บผ๋‚ด์˜ค๋Š” ๋ฐ ์žˆ์–ด ํŒ”๋ฐฉ๋ฏธ์ธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ Map ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ์–ธํ•˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, ๊ฐ’์„ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.


How to insert value

๋จผ์ € ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ insert ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <map>
#include <pair>

using std::map;
using std::pair;

int main(int argc, char **argv)
{
map<int, int> m;
m.insert(pair(1, 2));

return 0;
}

insert ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž๊ฐ€ ์•„๋‹Œ 1๊ฐœ์˜ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์Œ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” Pair ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜น์€ C++์—์„œ ์ œ๊ณตํ•˜๋Š” make_pair ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ C++ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” operator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
#include <map>

using std::map;

int main(int argc, char **argv)
{
map<int, int> m;
m[1] = 2;

return 0;
}

operator๋Š” ํ•จ์ˆ˜ ์—†์ด ์ˆ˜์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๋” ๊น”๋”ํ•˜๊ณ  pair๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์ด ๋” ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ํ•จ์ •์ด ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.


Insert method vs Operator

operator๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด Insert ๋ฉ”์†Œ๋“œ๋Š” deprecated ํ•ด๋„ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์™œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๊ฑธ๊นŒ์š”? ๊ฑฐ๊ธฐ์—๋Š” ์•„์ฃผ ๋ฏธ์„ธํ•œ ์ฐจ์ด๊ฐ€ ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Insert Method
    • Map์—์„œ Key์™€ Value๋ฅผ ๋„ฃ๋Š” ๋ฉ”์†Œ๋“œ.
    • ๊ธฐ์กด์˜ ํ‚ค๊ฐ’์ด ์ค‘๋ณต๋  ๊ฒฝ์šฐ, ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋ฌด์‹œํ•จ
  • Operator
    • ๊ธฐ์กด์˜ ํ‚ค๊ฐ’์ด ์ค‘๋ณต๋  ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋Œ€์ฒด

Insert Method๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ๊ธฐ์กด์˜ ํ‚ค๊ฐ’์ด ์ค‘๋ณต๋˜์—ˆ์„ ๋•Œ, ์ด ๋ฉ”์†Œ๋“œ๋Š” ๊ทธ์ € ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ง๊ทธ๋Œ€๋กœ ๊ธฐ์กด์˜ ํ‚ค๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” value๋ฅผ ์ง€ํ‚จ๋‹ค๋Š” ๊ฒƒ์ด์ฃ . ์ฆ‰ ํ‚ค๊ฐ’์ด ์ค‘๋ณต๋  ๊ฒฝ์šฐ, ๊ธฐ์กด์˜ ๊ฐ’์„ ์šฐ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ operator๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ๊ธฐ์กด์˜ ํ‚ค ๊ฐ’์ด ์กด์žฌํ•œ๋‹คํ•˜๋”๋ผ๋„ ํ˜„์žฌ์˜ ์ฝ”๋“œ๋ฅผ ์ค‘์‹œํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด์˜ ํ‚ค์— ์กด์žฌํ–ˆ๋˜ ๊ฐ’์€ ์ œ๊ฑฐ๋˜๊ณ , ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋˜๋Š”


์ด์–ด์„œ ์ฝ์œผ์‹œ๋ ค๋ฉด ์•„๋ž˜์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์ฃผ์„ธ์š”.


... ๊ณ„์† ์ฝ๊ธฐ



๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments