C, C++

[C++] STL

๋ฒผ๋ฆฌ01 2024. 9. 5. 14:44

๐Ÿ“ŒSTL(Standard Template Library)

ํ‘œ์ค€ ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์ž๋ฃŒ๊ตฌ์กฐ(์ปจํ…Œ์ด๋„ˆ, ์ดํ„ฐ๋ ˆ์ดํ„ฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜)๋ฅผ ๋ชจ์•„๋†“์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

์ปจํ…Œ์ด๋„ˆ(์ž๋ฃŒ๊ตฌ์กฐ), ๋ฐ˜๋ณต์ž(iterator), ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ˆ˜์น˜

๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์žฌ์‚ฌ์šฉ์„ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. C์–ธ์–ด๋Š” CRT(C Runtime Library)๋ผ๋Š” ์ด๋ฆ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ, C++์€ C++ Standard Library๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 1994๋…„ C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— STL์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

ํ‘œ์ค€ ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋Š” ๋œป ๊ทธ๋Œ€๋กœ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Generic Programming)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฌด๋ถ„๋ณ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋ฅผ ์ง€์–‘ํ•˜๊ณ  ํ‘œ์ค€ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ง€ํ–ฅํ•œ๋‹ค. ํ‘œ์ค€์ด๋ฏ€๋กœ ์ด์‹์„ฑ์ด ์ข‹๋‹ค.

๊ฐ ์ž๋ฃŒ๊ตฌ์กฐ๋งˆ๋‹ค ์„ฑ๋Šฅ์˜ ์ฐจ์ด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ฒ€์ƒ‰, ์ •๋ ฌ, ์‚ฝ์ž…, ์‚ญ์ œ์— ์ตœ์ ํ™”๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ ์ ˆํžˆ ๊ณจ๋ผ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

๐Ÿ“Œ์ปจํ…Œ์ด๋„ˆ(Container)

Java์˜ ์ปฌ๋ ‰์…˜๊ณผ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ(์ˆœ์ฐจ ์ปจํ…Œ์ด๋„ˆ) (Sequence Containers)
    • vector ๋™์  ๋ฐฐ์—ด๋กœ, ํฌ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ์กฐ์ •๋œ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํšจ์œจ์ ์ธ ๋์— ์š”์†Œ ์ถ”๊ฐ€/์ œ๊ฑฐ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ค‘๊ฐ„ ์‚ฝ์ž… ์‚ญ์ œ๋Š” ์š”์†Œ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น„๋ก€ํ•œ๋‹ค. ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋’ค๋กœ ๋ฐ€๊ฑฐ๋‚˜ ์•ž์œผ๋กœ ๋‹น๊ธฐ๊ธฐ ๋•Œ๋ฌธ. ์œ ์‚ฌ) ๋™์ ๋ฐฐ์—ด, arraylist
    • deque ์–‘์ชฝ ๋์—์„œ ๋น ๋ฅด๊ฒŒ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฐํ(๋”๋ธ” ์—”๋””๋“œ ํ). ์„ฑ๋Šฅ ๋˜ํ•œ ๋ฒกํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์š”์†Œ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น„๋ก€ํ•œ๋‹ค.
    • list ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ, ์ž„์˜์˜ ์œ„์น˜์—์„œ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ํšจ์œจ์ . ์š”์†Œ์˜ ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ๊ฐ€ ์œ„์น˜์™€ ์ƒ๊ด€์—†์ด ๊ฐ™์€ ์†๋„. ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๊ฐ€ ํฌ์ธํ„ฐ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค.
    • array ๊ณ ์ • ํฌ๊ธฐ์˜ ๋ฐฐ์—ด. std::array๋Š” ํฌ๊ธฐ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •๋œ๋‹ค.
  • ์ •๋ ฌ ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ (Sort Associative Containers)
    • ์—ฐ๊ด€๋œ ๋‹ค๋ฅธ ํƒ€์ž…๋“ค์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ. ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์Œ. ์‹คํ–‰ ์‹œ ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ.
    • set ๊ณ ์œ ํ•œ ์š”์†Œ๋“ค์„ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์ €์žฅํ•œ. ํ‚ค์˜ ์ค‘๋ณต์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์›ํ•˜๋Š” ํ‚ค๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ธ๋‹ค.
    • map ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜๋ฉฐ, ํ‚ค๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ํ‚ค์˜ ์ค‘๋ณต์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฐ’, ์ฆ‰ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ธ๋‹ค. key:value
    • multiset ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋Š” ์ •๋ ฌ๋œ ์ง‘ํ•ฉ.
    • multimap ์ค‘๋ณต๋œ ํ‚ค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ํ‚ค-๊ฐ’ ์Œ์˜ ์ง‘ํ•ฉ.
  • ๋น„์ˆœ์ฐจ ์ปจํ…Œ์ด๋„ˆ (Unordered Containers)
    • unordered_set ํ•ด์‹œ ๊ธฐ๋ฐ˜์˜ ์ง‘ํ•ฉ์œผ๋กœ, ์š”์†Œ๋“ค์€ ์ •๋ ฌ๋˜์ง€ ์•Š์Œ.
    • unordered_map ํ•ด์‹œ ๊ธฐ๋ฐ˜์˜ ํ‚ค-๊ฐ’ ์Œ์˜ ์ง‘ํ•ฉ.
    • unordered_multiset ํ•ด์‹œ ๊ธฐ๋ฐ˜์˜ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋Š” ์ง‘ํ•ฉ.
    • unordered_multimap ํ•ด์‹œ ๊ธฐ๋ฐ˜์˜ ์ค‘๋ณต๋œ ํ‚ค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ํ‚ค-๊ฐ’ ์Œ์˜ ์ง‘ํ•ฉ.
  • ๋ฐ˜๋ณต์ž(Iterator)
    • ์ปจํ…Œ์ด๋„ˆ(๋˜๋Š” ๋ฐฐ์—ด)์˜ ์š”์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์š”์†Œ์˜ ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผํ•œ๋‹ค. ์š”์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋งŒํผ์„ ์ด๋™ํ•˜๋ฉฐ ์ฝ์–ด์•ผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํฌ๊ธฐ๋‚˜ ํƒ€์ž…์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ ๋„ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋ฐ˜๋ณต์ž๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด. ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ด๋™ํ•˜๋ฉด์„œ ์š”์†Œ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜(algorithm)
    • ์ •๋ ฌ ๋ฐ ๊ฒ€์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜.
    • ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ ์ˆœ์ฐจ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์ˆœ์ฐจ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ฒ”์šฉ ์ˆ˜์น˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๊ธฐํƒ€
    • stack: LIFO(Last In First Out) ๋ฐฉ์‹์˜ ์ปจํ…Œ์ด๋„ˆ.
    • queue: FIFO(First In First Out) ๋ฐฉ์‹์˜ ์ปจํ…Œ์ด๋„ˆ.
    • priority_queue: ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ํ๋กœ, ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊บผ๋‚ธ๋‹ค.

 

 

๐Ÿ“Œ๋ฒกํ„ฐ(Vector)

์ผ๋ฐ˜ํ™”๋œ ์ปจํ…Œ์ด๋„ˆ ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ํ•„์š”ํ•œ ํฌ๊ธฐ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์žฌํ• ๋‹นํ•˜์—ฌ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋‹ค.(๋™์  ๋ฐฐ์—ด) ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ€์ž…์— ๋ฌด๊ด€ํ•จ.

์ดˆ๊ธฐ ์ƒ์„ฑ๋œ ๊ธธ์ด๋งŒํผ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฝ‰ ์ฐจ์žˆ์„ ๋•Œ ๋” ๋„ฃ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ๋‚ด๋ถ€์—์„œ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฐ๋‹ค.

`vector<T> vectorName;` `vector<int> intVector;` `vector<int> intVector(5);`

๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋กœ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

	for (int i = 0; i < vec.size(); i++) {
		cout << vec[i] << endl;
	}

 

 

๐Ÿ“Œ๋ฐํฌ(Deque)

๋ฒกํ„ฐ์™€ ์œ ์‚ฌํ•˜๋‚˜ ์–‘์ชฝ ๋์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž… ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ. ์•ž/์ค‘๊ฐ„ ์ธ๋ฑ์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๊ฒฝ์šฐ ๋ชจ๋“  ์š”์†Œ์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋’ค๋กœ ๋ฐ€๋ฆฌ๋ฉด์„œ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋Š” ๋ฒกํ„ฐ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ปจํ…Œ์ด๋„ˆ.

`deque<T> dqName; deque<int> dq;`

 

๐Ÿ“Œ๋ฆฌ์ŠคํŠธ(List)

 

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„๋œ ์ปจํ…Œ์ด๋„ˆ. ๊ฐ๊ฐ์˜ ์š”์†Œ๊ฐ€ ํฌ์ธํ„ฐ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ธ์ ‘ํ•ด ์žˆ์ง€ ์•Š๊ณ , ๋…ผ๋ฆฌ์ ์ธ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ ํฌ์ธํ„ฐ๋กœ ์ด์ „ ๋˜๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ ์†๋„๊ฐ€ ์ผ์ •ํ•˜๋‹ค.

list<T> li; list<int> li;

 

๐Ÿ“Œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(Linked-List)

 

์š”์†Œ๋“ค์ด ์ธ์ ‘ํ•ด์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ ๋„์ฒ˜์— ํฉ์–ด์ ธ์„œ ์ž์‹ ์˜ ์ด์ „ ๋˜๋Š” ๋‹ค์Œ ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ํฌ์ธํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ. ์ถ”์ƒ์  ์ˆœ์„œ์™€ ๋ฌผ๋ฆฌ์  ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ๋ฌผ๋ฆฌ์ ์ธ ์ˆœ์„œ์™€ ์ƒ๊ด€์ด ์—†๋‹ค. ์ž„์˜์˜ ์œ„์น˜์— ๋Œ€ํ•œ ์š”์†Œ์˜ ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ ์†๋„๊ฐ€ ๋™์ผํ•˜๋‹ค.

 

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์—์„œ ์›์†Œ๋Š” ๋ฐ์ดํ„ฐ(๊ฐ’)์™€ ๋งํฌ(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’)๋ฅผ ๋™์‹œ์— ๊ฐ€์ง€๋ฉฐ ๋งํฌ๋Š” ํ›„ํ–‰ ์›์†Œ์˜ ์ฃผ์†Œ๊ฐ’์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋‹จ์œ„ ๊ตฌ์กฐ๋ฅผ ๋…ธ๋“œ(node)๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ ์š”์†Œ๋Š” ๋ฐ์ดํ„ฐ ์™ธ์— ์ด์ „/๋‹ค์Œ ๋…ธ๋“œ์˜ ๋งํฌ๋ฅผ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋‹ค์Œ ๋…ธ๋“œ์˜ ์ •๋ณด๋งŒ์„ ๊ฐ€์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Single Linked List), ์ด์ „๊ณผ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ๋‘˜ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Double Linked Llist)๋ผ๊ณ  ํ•œ๋‹ค.

 

struct Node{
	T value;
	Node* next;
}

 

#include <iostream>

using namespace std;

struct Node {
	int value;
	Node* next;
};

Node* head;
Node* now;

void InitLinkedList() {
	head = (Node*)malloc(sizeof(Node));
	
	head->value = NULL;
	head->next = NULL;
	now = head;
}

Node* InsertNode(Node* now, int value) {

	Node* newNode = (Node*)malloc(sizeof(Node));
	newNode->value = value;
	
	newNode->next = now->next;
	now->next = newNode;

	return newNode;
}

bool DeleteNode(int index) {
	
	Node* prev = head;
	Node* del;

	for (int i = 0; i < index; i++) {
		prev = prev->next;

		if (prev == NULL) {
			return false;
		}
	}

	del = prev->next;
	if (del == NULL) {
		return false;
	}

	prev->next = del->next;
	free(del);

	return true;

}

bool DeleteNode(Node* targetPrev) {

	Node* del; 

	del = targetPrev->next;

	if (del->next == NULL) {
		return false;
	}

	targetPrev->next = del->next;
	free(del);

	return true;

}

void DeleteList() {
	free(head);
	head = NULL;
}

int main() {

	InitLinkedList();

	for (int i = 0; i < 10; i++) {
		InsertNode(now, i + 1);
		now = now->next;
	}

	for (now = head->next; now; now = now->next) {
		cout << now->value << endl;
	}

	cout << endl;

	//bool result = DeleteNode(head);
	bool result = DeleteNode(9);

	cout << endl;

	cout << "result : " << result << endl;
	
	for (now = head->next; now; now = now->next) {
		cout << now->value << endl;
	}

	DeleteList();

}

 

 

 

๐Ÿ“ŒSet

 

์ •๋ ฌ ์—ฐ๊ด€ ์ปจํ…Œ์ด๋„ˆ. ์ˆœ์„œ๊ฐ€ ์—†๊ณ  ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ž๋ฃŒ๊ตฌ์กฐ. ๊ฐ’์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

 

#include <iostream>
#include <set>

using namespace std;

int main() {

	int arr[] =  {1, 2, 3, 2, 5, 6, 3};
	
	
	set<int> scon;

	set<int>::iterator it;

	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		scon.insert(arr[i]);
	}

	for (it = scon.begin(); it != scon.end(); it++) {
		cout << *it << endl;
	}
	
	return 0;

}

 

 

 

๐Ÿ“ŒMap

 

ํ‚ค:๊ฐ’ ํ˜•ํƒœ๋กœ ํ•˜๋‚˜์˜ ์Œ์„ ์ด๋ฃจ์–ด ๊ด€๋ฆฌ๋œ๋‹ค. ๊ฐ’์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ์šฐ ์œ ๋ฆฌํ•˜๋‹ค.

์‚ฝ์ž… ๋ฐ ์‚ญ์ œ ์‹œ ๋ฐ์ดํ„ฐ์˜ ์ด๋™์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฌ๋‹ค.

 

`map<keyType, dataType> m; map<string, int> ageList;`

`first` ๋Š” ํ‚ค, `second` ๋Š” ๊ฐ’.

 

	map<string, int> phoneBook;
	map<string, int>::iterator it;

	string name;

	for (int i = 0; i < sizeof(phoneList) / sizeof(phoneList[0]); i++) {
		phoneBook[phoneList[i].name] = phoneList[i].phone;
	}

	while (true) {
		cout << "์ข…๋ฃŒ: [q]";
		cout << "์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: ";
		cin >> name;

		if (name == "q") {
			break;
		}

		// phoneBook[name]์€ value๋งŒ์„ ๋ถˆ๋Ÿฌ์˜ค์ง€๋งŒ,
		// ๋ฐ˜๋ณต์ž๋กœ it = phoneBook.find(name);๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด
		// ์š”์†Œ์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํ‚ค์™€ ๊ฐ’์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!
		if (phoneBook[name]) {
			cout << "๋ฒˆํ˜ธ๋Š” " << phoneBook[name] << "์ž…๋‹ˆ๋‹ค." << endl;
		}
		else {
			cout << "์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.  [" << name << "]" << endl;
		}

	}

 

 

๐Ÿ“Œํ•ด์‹œ๋งต(hashMap)

 

STL์—์„œ๋Š” ํ•ด์‹œ๋งต์„ ์ง€์›ํ•œ๋‹ค. hash ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

* `hash_map` ์ด deprecated ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. `unordered_map` ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

unordered_map<string, int> coffee;
coffee["์•„๋ฉ”๋ฆฌ์นด๋…ธ"] = 2000;

unordered_map<string, int>::iterator it;

for (it = coffee.begin(); it != coffee.end(); it++) {
	cout << "[" << it->first << "] " << it->second << "์›" << endl;
}

 

	unordered_map<string, vector<string>> devLang;

	vector<string> c;
	c.push_back("C");
	c.push_back("C++");
	c.push_back("C#");

	vector<string> script;

	devLang["C ๊ณ„์—ด"] = c;

	vector<string> scr;
	scr.push_back("JavaScript");
	scr.push_back("TypeScript");

	devLang["Script ๊ณ„์—ด"] = scr;

	unordered_map<string, vector<string>>::iterator mapIt;
	vector<string>::iterator it;

	for (mapIt = devLang.begin(); mapIt != devLang.end(); mapIt++) {
		cout << "[" << mapIt->first << "]" << endl;
		for (it = mapIt->second.begin(); it != mapIt->second.end(); it++) {
			cout << *it << " " << endl;
		}

		cout << endl;
	}
[Script ๊ณ„์—ด]
JavaScript
TypeScript

[C ๊ณ„์—ด]
C
C++
C#

 

 

๐Ÿ“Œ๋ฐ˜๋ณต์ž(Iterator)

 

์ปจํ…Œ์ด๋„ˆ์˜ ๊ตฌ๊ฐ„์— ๋Œ€ํ•ด ๊ฐ’์„ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.(๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฅด๋”๋ผ๋„ ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.)

`list::iterator listIter; vector::iterator vectorIter;`

 

 

ํฌ์ธํ„ฐ์™€ ์œ ์‚ฌํ•จ. `listIter++` ์ฒ˜๋Ÿผ ๋ฐ˜๋ณต์ž๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒƒ์€ ๊ทธ ๋‹ค์Œ ์š”์†Œ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ์˜ `begin()` ์€ ์‹œ์ž‘ ์š”์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. `end()` ๋Š” ๋งˆ์ง€๋ง‰๊ฐ’์ด ์•„๋‹ˆ๋ผ ๋งˆ์ง€๋ง‰๊ฐ’์˜ ๋‹ค์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

๋ฌธ์ž์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์ž ํฌ์ธํ„ฐ๋กœ ๊ฐ ๋ฌธ์ž๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

char arr[] = "Hello!";

char* ptr = arr;

while (*ptr) // ptr != NULL
{
    cout << *ptr;
    ptr++;
}

 

 

์ปจํ…Œ์ด๋„ˆ๋„ ์ด์ฒ˜๋Ÿผ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฅด๋”๋ผ๋„ ๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋‚ด ํฌํ•จ๋œ ์š”์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋ฐ˜๋ณต์ž๋ฅผ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

int intArr[] = { 1, 2, 3, 4, 5 };

vector<int> vec(&intArr[0], &intArr[sizeof(intArr) / sizeof(intArr[0])]);
vector<int>::iterator it;

for (it = vec.begin(); it != vec.end(); it++) {
    cout << *it << " ";
}
list<int> li;
list<int>::iterator it;

for (int i = 0; i < 5; i++) {
    li.push_back(i + 1);
}

for (it = li.begin(); it != li.end(); it++) {
    cout << *it << " ";
}

 

 

๐Ÿ“Œ์•Œ๊ณ ๋ฆฌ์ฆ˜(Algorithm)

 

์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋‘” ํ•จ์ˆ˜. ์ •๋ ฌ, ๊ฒ€์ƒ‰, ์กฐ์ž‘ ๋“ฑ์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ํŠน์ • ์ปจํ…Œ์ด๋„ˆ์— ์ข…์†๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

 

ex) `find()` `first`์™€ `last` ์‚ฌ์ด์— `value`๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์ฐพ๋Š” ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์œ„์น˜์˜ ๋ฐ˜๋ณต์ž๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

ex) `for_each()` ์ „ ๊ตฌ๊ฐ„์„ ์ˆœํšŒํ•˜๋ฉด์„œ ์ธ์ž๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. `for_each`๋Š” ๋ฃจํ”„๋ฅผ ๋Œ๋ฆฌ๋Š” ์—ญํ• ๋งŒ ํ•˜๋ฏ€๋กœ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์„ ํ•˜๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค. ๋‚ด๋ถ€์—์„œ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ex) `copy()` ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฒ”์œ„๊ฐ’์„ ๋Œ€์ƒ์ด ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌํ•˜๋Š” ํ•จ์ˆ˜.

ex) `sort()` ๊ธฐ๋ณธ์€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ. ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ ค๋ฉด `greator<int>()` ๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•จ.

 

	int intArr[] = { 1, 2, 3, 4, 5 };

	vector<int> vec(&intArr[0], &intArr[sizeof(intArr) / sizeof(intArr[0])]);
	vector<int>::iterator it;

	if (find(vec.begin(), vec.end(), 5) != vec.end()) {
		cout << "Found Five!";
	}
	else {
		cout << "Not Found";
	}

'C, C++' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[C++] ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ  (0) 2024.09.19
[C++] ํ…œํ”Œ๋ฆฟ(Template)  (0) 2024.08.29
[C++] ์ƒ์†(Inheritance)  (0) 2024.08.29
[C++] ๊ฐ์ฒด ์ง€ํ–ฅ  (6) 2024.08.19
[C] ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น  (0) 2024.08.13