λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 기초

[C++] 18. Standard Library μ •λ³΅ν•˜κΈ°(STL)

by μ„œμ•„λž‘πŸ˜ 2023. 8. 6.

 

 

 

STLμ΄λž€?

C++ STL(Standard Template Library)은 C++ ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ˜ μ€‘μš”ν•œ κ΅¬μ„± μš”μ†Œ μ€‘ ν•˜λ‚˜λ‘œ, μ—¬λŸ¬ μœ μš©ν•œ λ°μ΄ν„° κ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ„ μ œκ³΅ν•˜λŠ” μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€. STL은 C++ ν‘œμ€€μ΄λ―€λ‘œ C++ μ–Έμ–΄μ— λ‚΄μž₯λ˜μ–΄ μžˆμœΌλ©°, λ§Žμ€ C++ μ»΄νŒŒμΌλŸ¬μ™€ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

STL의 ν•΅μ‹¬ μ•„μ΄λ””μ–΄λŠ” 'ν…œν”Œλ¦Ώ(Template)'을 μ‚¬μš©ν•˜μ—¬ μ œλ„€λ¦­(generic)ν•œ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λœ λ°μ΄ν„° κ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ„ μ œκ³΅ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ κ΅¬ν˜„λœ STL μ»¨ν…Œμ΄λ„ˆμ™€ μ•Œκ³ λ¦¬μ¦˜μ€ νŠΉμ • μžλ£Œν˜•μ— μ’…μ†λ˜μ§€ μ•Šκ³ , λ‹€μ–‘ν•œ μžλ£Œν˜•μ— λŒ€ν•΄ μž¬μ‚¬μš©λ  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ΄λ₯Ό ν†΅ν•΄ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό μΌλ°˜μ„±μ„ λ†’일 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

STL은 μ£Όλ‘œ λ‹€μŒκ³Ό κ°™μ€ μ„Έ κ°€μ§€ μš”μ†Œλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

1. μ»¨ν…Œμ΄λ„ˆ (Containers): λ°μ΄ν„°λ₯Ό μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” ν΄λž˜μŠ€λ“€λ‘œ, λ°°μ—΄, λ¦¬μŠ€νŠΈ, ν•΄μ‹œ ν…Œμ΄λΈ” λ“± λ‹€μ–‘ν•œ ν˜•νƒœμ˜ λ°μ΄ν„° κ΅¬μ‘°λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ£Όμš” μ»¨ν…Œμ΄λ„ˆλ‘œλŠ” vector, list, set, map, unordered_set, unordered_map λ“±μ΄ μžˆμŠ΅λ‹ˆλ‹€.

2. λ°˜λ³΅μž (Iterators): μ»¨ν…Œμ΄λ„ˆμ˜ μ›μ†Œμ— μ ‘κ·Όν•˜κ³  μˆœνšŒν•˜λŠ” λ°©λ²•μ„ μΆ”μƒν™”ν•˜λŠ” ν΄λž˜μŠ€ λ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. λ°˜λ³΅μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆμ˜ μ›μ†Œμ— μ ‘κ·Όν•˜κ³  μˆ˜μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

3. μ•Œκ³ λ¦¬μ¦˜ (Algorithms): μ»¨ν…Œμ΄λ„ˆμ—μ„œ μž‘업을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ“€μ˜ μ§‘ν•©μž…λ‹ˆλ‹€. μ •λ ¬, κ²€μƒ‰, λ³΅μ‚¬, λ³€ν™˜ λ“± λ‹€μ–‘ν•œ μž‘업을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ“€μ΄ μžˆμœΌλ©°, μ΄λŸ¬ν•œ μ•Œκ³ λ¦¬μ¦˜λ“€μ€ μ»¨ν…Œμ΄λ„ˆμ™€ λ…λ¦½μ μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

STL을 μ‚¬μš©ν•˜λ©΄ λ°μ΄ν„° κ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  ν•„μš” μ—†μ΄ μ΄λ―Έ κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” μ»¨ν…Œμ΄λ„ˆμ™€ μ•Œκ³ λ¦¬μ¦˜μ„ ν™œμš©ν•˜μ—¬ ν”„λ‘œκ·Έλž˜λ°ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” κ°œλ°œμžλ“€μ΄ νš¨μœ¨μ μ΄κ³  μ•ˆμ •μ μΈ μ½”λ“œλ₯Ό μ‰½κ²Œ μž‘μ„±ν•  μˆ˜ μžˆλ„둝 λ„μ™€μ€λ‹ˆλ‹€.

 

 

 

STL μ»¨ν…Œμ΄λ„ˆ

C++ STL(Standard Template Library)은 C++ ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ˜ μ€‘μš”ν•œ λΆ€λΆ„μœΌλ‘œ, λ‹€μ–‘ν•œ μœ μš©ν•œ λ°μ΄ν„° κ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ„ μ œκ³΅ν•˜μ—¬ κ°œλ°œμžλ“€μ΄ νš¨μœ¨μ μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  μˆ˜ μžˆλ„둝 λ„μ™€μ€λ‹ˆλ‹€. STL은 ν¬κ²Œ λ‹€μŒκ³Ό κ°™μ€ μ„Έ κ°€μ§€ μ£Όμš” μ»¨ν…Œμ΄λ„ˆ μ’…λ₯˜λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

1. Sequence Containers(순차 μ»¨ν…Œμ΄λ„ˆ):
   - vector: λ™μ  λ°°μ—΄(Dynamic Array)둜 ν¬κΈ°λ₯Ό λ³€κ²½ν•  μˆ˜ μžˆμœΌλ©° λΉ λ₯Έ μž„μ˜ μ ‘근을 μ§€μ›ν•©λ‹ˆλ‹€.
   - list: μ΄μ€‘ μ—°κ²° λ¦¬μŠ€νŠΈ(Doubly Linked List)둜 μ›μ†Œμ˜ μ‚½μž…κ³Ό μ‚­μ œκ°€ λΉˆλ²ˆν•œ κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€.
   - deque: 덱(Deque)은 μ–‘μͺ½ λμ—μ„œ μ›μ†Œλ₯Ό μ‚½μž…/μ‚­μ œν•˜λŠ” 데 효율적인 λ”λΈ”μ—”λ””λ“œ 큐(Double-ended Queue)μž…λ‹ˆλ‹€.(κ·Έλƒ₯ queue도 λ‹Ήμ—°νžˆ μžˆμŠ΅λ‹ˆλ‹€.)
   - array: κ³ μ • ν¬κΈ° λ°°μ—΄λ‘œ, ν¬κΈ°κ°€ λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. C μŠ€νƒ€μΌ λ°°μ—΄λ³΄λ‹€ μ•ˆμ „ν•˜κ³  νŽΈλ¦¬ν•©λ‹ˆλ‹€.

2. Associative Containers(μ—°κ΄€ μ»¨ν…Œμ΄λ„ˆ):
   - set: μ€‘볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” μ›μ†Œμ˜ μ •λ ¬λœ μ§‘ν•©μž…λ‹ˆλ‹€.
   - multiset: μ€‘볡을 ν—ˆμš©ν•˜λŠ” μ›μ†Œμ˜ μ •λ ¬λœ μ§‘ν•©μž…λ‹ˆλ‹€.
   - map: ν‚€μ™€ κ°’을 μ—°κ²°ν•˜μ—¬ ν‚€λ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬λœ μ§‘ν•©μž…λ‹ˆλ‹€.
   - multimap: ν‚€μ™€ κ°’을 μ—°κ²°ν•˜λŠ”데 μ€‘볡이 ν—ˆμš©λ˜λŠ” μ •λ ¬λœ μ§‘ν•©μž…λ‹ˆλ‹€.

3. Unordered Containers(λΉ„μ •λ ¬ μ—°κ΄€ μ»¨ν…Œμ΄λ„ˆ):
   - unordered_set: μ€‘볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” ν•΄μ‹œ(Hash) κΈ°λ°˜ μ§‘ν•©μž…λ‹ˆλ‹€.
   - unordered_multiset: μ€‘볡을 ν—ˆμš©ν•˜λŠ” ν•΄μ‹œ κΈ°λ°˜ μ§‘ν•©μž…λ‹ˆλ‹€.
   - unordered_map: ν‚€μ™€ κ°’을 μ—°κ²°ν•˜λŠ”데 ν•΄μ‹œ κΈ°λ°˜μœΌλ‘œ λ™μž‘ν•˜λŠ” λ§΅μž…λ‹ˆλ‹€.
   - unordered_multimap: ν‚€μ™€ κ°’을 μ—°κ²°ν•˜λŠ”데 μ€‘볡이 ν—ˆμš©λ˜λŠ” ν•΄μ‹œ κΈ°λ°˜ λ§΅μž…λ‹ˆλ‹€.

STL μ»¨ν…Œμ΄λ„ˆλ“€μ€ κ°κ°μ˜ νŠΉμ§•μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ μ μ ˆν•œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ„ νƒν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•©λ‹ˆλ‹€. λͺ‡ κ°€μ§€ μ€‘μš”ν•œ νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

1. λ©”λͺ¨λ¦¬ κ΄€λ¦¬: vectorλŠ” λ™μ  λ°°μ—΄μ„ μ‚¬μš©ν•˜λ―€λ‘œ λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ νš¨μœ¨μ μž…λ‹ˆλ‹€. list와 dequeλŠ” κ°κ° μ΄μ€‘ μ—°κ²° λ¦¬μŠ€νŠΈμ™€ λ±μ„ μ‚¬μš©ν•˜μ—¬ μ‚½μž…/μ‚­μ œμ— μš©μ΄ν•©λ‹ˆλ‹€.

2. μ •λ ¬κ³Ό κ²€μƒ‰: μ •λ ¬λœ λ°μ΄ν„°λ₯Ό λ‹€λ£° λ•Œμ—λŠ” set, map, unordered_set, unordered_map보닀 multiset, multimap, unordered_multiset, unordered_multimap이 μœ μš©ν•©λ‹ˆλ‹€.

3. μ„±λŠ₯: μ»¨ν…Œμ΄λ„ˆλ“€μ€ μ„œλ‘œ λ‹€λ₯Έ μ„±λŠ₯ νŠΉμ§•μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆλ₯Ό λ“€μ–΄, vectorλŠ” μž„μ˜ μ ‘근이 λΉ λ₯΄μ§€λ§Œ μ€‘κ°„ μ‚½μž…/μ‚­μ œκ°€ λŠλ¦½λ‹ˆλ‹€. listλŠ” μ€‘κ°„ μ‚½μž…/μ‚­μ œκ°€ λΉ λ₯΄μ§€λ§Œ μž„μ˜ μ ‘근이 λŠλ¦½λ‹ˆλ‹€.

4. μ€‘볡 ν—ˆμš© μ—¬λΆ€: setκ³Ό map은 μ€‘볡을 ν—ˆμš©ν•˜μ§€ μ•Šμ§€λ§Œ multisetκ³Ό multimap은 μ€‘볡을 ν—ˆμš©ν•©λ‹ˆλ‹€. unordered_setκ³Ό unordered_map도 λ™μΌν•œ μ›λ¦¬λ‘œ μ€‘볡 μ—¬λΆ€κ°€ κ²°μ •λ©λ‹ˆλ‹€.

STL μ»¨ν…Œμ΄λ„ˆλ“€μ€ μ΄μ™Έμ—λ„ λ‹€μ–‘ν•œ λ©€λ²„ ν•¨μˆ˜μ™€ λ°˜λ³΅μž(Iterators)λ₯Ό μ œκ³΅ν•˜μ—¬ λ°μ΄ν„°μ˜ μ‘°μž‘κ³Ό μ ‘근을 μš©μ΄ν•˜κ²Œ ν•©λ‹ˆλ‹€. κ° μ»¨ν…Œμ΄λ„ˆμ˜ νŠΉμ§•μ„ μž˜ μ΄ν•΄ν•˜κ³  ν•„μš”μ— λ§žκ²Œ μ„ νƒν•˜μ—¬ μ‚¬μš©ν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•©λ‹ˆλ‹€.

 

 

 

반볡자(Iterator)

STL(Standard Template Library)μ—μ„œ λ°˜λ³΅μž(Iterator)λŠ” μ»¨ν…Œμ΄λ„ˆμ˜ μ›μ†Œμ— μ ‘κ·Όν•˜κ³  μˆœνšŒν•˜λŠ” μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” κ°œμ²΄μž…λ‹ˆλ‹€. λ°˜λ³΅μžλ₯Ό μ‚¬μš©ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆμ˜ λ‚΄μš©μ„ μˆœνšŒν•˜κ±°λ‚˜ μˆ˜μ •ν•˜λŠ” λ“±μ˜ μž‘업을 μΌλ°˜μ μΈ λ°©λ²•μœΌλ‘œ μˆ˜ν–‰ν•  μˆ˜ μžˆμœΌλ©°, μ•Œκ³ λ¦¬μ¦˜κ³Ό μ»¨ν…Œμ΄λ„ˆλ₯Ό λΆ„λ¦¬ν•˜μ—¬ μ‚¬μš©ν•  μˆ˜ μžˆλ„둝 ν•©λ‹ˆλ‹€.

λ°˜λ³΅μžλŠ” ν¬μΈν„°μ™€ μœ μ‚¬ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ§€κ³  μžˆμœΌλ©°, μΌλ°˜μ μœΌλ‘œ λ‹€μŒκ³Ό κ°™μ€ μ£Όμš” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€:

1. μ›μ†Œμ— μ ‘κ·Ό: λ°˜λ³΅μžλŠ” μ»¨ν…Œμ΄λ„ˆμ˜ μ›μ†Œμ— μ ‘κ·Όν•˜λŠ” μ—­ν• μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. ν¬μΈν„°μ²˜λŸΌ μ—­μ°Έμ‘° μ—°μ‚°μž(`*`)λ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜„μž¬ μ›μ†Œμ˜ κ°’을 κ°€μ Έμ˜¬ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

2. μ›μ†Œ μ΄λ™: `++` μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒ μ›μ†Œλ‘œ μ΄λ™ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ λ°˜λ³΅μžλ₯Ό μ΄λ™μ‹œν‚€λŠ” κ²ƒμ„ "순회(iteration)"라고 ν•©λ‹ˆλ‹€.

3. λΉ„ꡐ: λ°˜λ³΅μžλ“€λΌλ¦¬μ˜ μƒλŒ€μ μΈ μœ„μΉ˜λ₯Ό λΉ„ꡐ할 μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. `==`, `!=`, `<`, `>`, `<=`, `>=` μ—°μ‚°μžλ“€μ„ μ‚¬μš©ν•˜μ—¬ λΉ„κ΅ν•©λ‹ˆλ‹€.

STLμ—μ„œλŠ” λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ λ°˜λ³΅μžλ“€μ΄ μ œκ³΅λ˜λ©°, μ»¨ν…Œμ΄λ„ˆμ˜ μ’…λ₯˜μ™€ μž‘μ—…μ˜ νŠΉμ„±μ— λ”°λΌ μ μ ˆν•œ λ°˜λ³΅μžλ₯Ό μ„ νƒν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ£Όμš” λ°˜λ³΅μž μ’…λ₯˜λ‘œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

1. Input Iterator: μ½κΈ° μ „μš©μœΌλ‘œ μ»¨ν…Œμ΄λ„ˆμ˜ μ›μ†Œλ₯Ό μˆœνšŒν•©λ‹ˆλ‹€. μˆœνšŒν•˜λ©° μ›μ†Œλ₯Ό μˆ˜μ •ν•  μˆ˜ μ—†μŠ΅λ‹ˆλ‹€.

2. Output Iterator: μ“°κΈ° μ „μš©μœΌλ‘œ μ»¨ν…Œμ΄λ„ˆμ— μ›μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μˆ˜μ •ν•©λ‹ˆλ‹€.

3. Forward Iterator: μˆœλ°©ν–₯으둜만 μ΄λ™ν•  μˆ˜ μžˆμœΌλ©° μ½κΈ° λ° μ“°κΈ°κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

4. Bidirectional Iterator: μ–‘λ°©ν–₯으둜 μ΄λ™ν•  μˆ˜ μžˆμœΌλ©°, μˆœλ°©ν–₯κ³Ό μ—­λ°©ν–₯으둜의 μ΄λ™μ΄ λͺ¨λ‘ κ°€λŠ₯ν•©λ‹ˆλ‹€.

5. Random Access Iterator: μž„μ˜ μ ‘근이 κ°€λŠ₯ν•˜λ©°, μΈλ±μŠ€λ₯Ό μ΄μš©ν•΄ μ›μ†Œμ— O(1) μ‹œκ°„에 μ ‘κ·Όν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. ν¬μΈν„°κ°€ μ΄μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

STL μ•Œκ³ λ¦¬μ¦˜μ€ λ°˜λ³΅μžλ₯Ό ν†΅ν•΄ μ»¨ν…Œμ΄λ„ˆμ˜ μ›μ†Œλ“€μ„ μˆœνšŒν•˜κ³  μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—, λ°˜λ³΅μžμ˜ μ‚¬μš©μ€ STL의 κ°•λ ₯ν•œ κΈ°λŠ₯ μ€‘ ν•˜λ‚˜μž…λ‹ˆλ‹€. λ°˜λ³΅μžλ₯Ό μ΄ν•΄ν•˜κ³  μ μ ˆνžˆ ν™œμš©ν•˜λ©΄ λ³΄λ‹€ νš¨μœ¨μ μ΄κ³  μΌλ°˜μ μΈ μ•Œκ³ λ¦¬μ¦˜μ„ μž‘μ„±ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

STL λ©”μ„œλ“œ

1. vector μ‚¬μš© λ©”μ„œλ“œ

#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // μ›μ†Œ μΆ”κ°€
    numbers.push_back(6);

    // μ›μ†Œ 개수 좜λ ₯
    std::cout << "Size: " << numbers.size() << std::endl;

    // μ›μ†Œ μ ‘κ·Ό
    std::cout << "First Element: " << numbers[0] << std::endl;

    // 반볡자λ₯Ό μ‚¬μš©ν•œ μ›μ†Œ 순회
    for (auto it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

 

2. map μ‚¬μš© λ©”μ„œλ“œ

#include <map>
#include <iostream>

int main() {
    std::map<std::string, int> scores;

    // μ›μ†Œ μΆ”κ°€
    scores["Alice"] = 100;
    scores["Bob"] = 85;
    scores["Charlie"] = 90;

    // μ›μ†Œ 개수 좜λ ₯
    std::cout << "Size: " << scores.size() << std::endl;

    // μ›μ†Œ μ ‘κ·Ό
    std::cout << "Bob's score: " << scores["Bob"] << std::endl;

    // 반볡자λ₯Ό μ‚¬μš©ν•œ μ›μ†Œ 순회
    for (auto it = scores.begin(); it != scores.end(); ++it) {
        std::cout << it->first << ": " << it->second << std::endl;
    }

    return 0;
}

 

3. algorithm λΌμ΄λΈŒλŸ¬λ¦¬μ˜ λ©”μ„œλ“œ

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 3};

    // μ •λ ¬
    std::sort(numbers.begin(), numbers.end());

    // νŠΉμ • κ°’ μ°ΎκΈ°
    int target = 8;
    auto it = std::find(numbers.begin(), numbers.end(), target);
    if (it != numbers.end()) {
        std::cout << target << " found at index: " << std::distance(numbers.begin(), it) << std::endl;
    } else {
        std::cout << target << " not found." << std::endl;
    }

    // 합계 계산
    int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
    std::cout << "Sum: " << sum << std::endl;

    return 0;
}

 

4. μ›ν•˜λŠ” μ›μ†Œ μ°ΎκΈ°(find, find_if, count, count_if)

// find
#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    int target = 3;

    auto it = std::find(numbers.begin(), numbers.end(), target);

    if (it != numbers.end()) {
        std::cout << target << " found at index: " << std::distance(numbers.begin(), it) << std::endl;
    } else {
        std::cout << target << " not found." << std::endl;
    }

    return 0;
}
// find_if
#include <algorithm>
#include <vector>
#include <iostream>

bool isEven(int num) {
    return num % 2 == 0;
}

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    auto it = std::find_if(numbers.begin(), numbers.end(), isEven);

    if (it != numbers.end()) {
        std::cout << "First even number: " << *it << std::endl;
    } else {
        std::cout << "No even number found." << std::endl;
    }

    return 0;
}
// count
#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 2, 4, 5, 2};
    int target = 2;

    size_t count = std::count(numbers.begin(), numbers.end(), target);
    std::cout << target << " appears " << count << " times." << std::endl;

    return 0;
}
// count_if
#include <algorithm>
#include <vector>
#include <iostream>

bool isEven(int num) {
    return num % 2 == 0;
}

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    size_t count = std::count_if(numbers.begin(), numbers.end(), isEven);
    std::cout << "Number of even numbers: " << count << std::endl;

    return 0;
}

 

 

 

std::find_if와 Predicate, 그리고 λžŒλ‹€ν•¨μˆ˜

Predicate

PredicateλŠ” μ‘°κ±΄μ„ νŒλ³„ν•˜λŠ” ν•¨μˆ˜ κ°μ²΄ λ˜λŠ” ν•¨μˆ˜ ν¬μΈν„°λ₯Ό μΌλ°˜μ μœΌλ‘œ κ°€λ¦¬ν‚€λŠ” μš©μ–΄μž…λ‹ˆλ‹€. Predicate ν•¨μˆ˜λŠ” λ³΄ν†΅ μ°Έ λ˜λŠ” κ±°μ§“을 λ°˜ν™˜ν•©λ‹ˆλ‹€. STL μ•Œκ³ λ¦¬μ¦˜μ—μ„œλŠ” find_if와 κ°™μ€ ν•¨μˆ˜λ“€μ΄ Predicateλ₯Ό μ‚¬μš©ν•˜μ—¬ μ›μ†Œλ₯Ό κ²€μƒ‰ν•˜κ±°λ‚˜ μ •λ ¬ν•˜λŠ” λ“±μ˜ μž‘업을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

Predicate ν•¨μˆ˜λŠ” 주어진 쑰건에 따라 μ›μ†Œλ₯Ό μ„ νƒν•˜κ±°λ‚˜ κ±ΈλŸ¬λ‚΄λŠ”λ° μ‚¬μš©λ˜λ©°, λžŒλ‹€ ν•¨μˆ˜λ‚˜ ν•¨μˆ˜ 객체둜 μž‘μ„±ν•˜μ—¬ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ°œλ…λ“€μ„ ν•¨κ»˜ μ‘μš©ν•˜λ©΄ STL μ•Œκ³ λ¦¬μ¦˜μ„ 맀우 μœ μ—°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

λžŒλ‹€ ν•¨μˆ˜ (Lambda Function)

λžŒλ‹€ ν•¨μˆ˜λŠ” κ°„λ‹¨ν•œ 읡λͺ… ν•¨μˆ˜λ‘œμ„œ, ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šκ³  λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. 주둜 ν•¨μˆ˜ 객체λ₯Ό κ°„νŽΈν•˜κ²Œ 생성할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 

[캑처 리슀트](λ§€κ°œλ³€μˆ˜ 리슀트) -> λ°˜ν™˜ν˜• {
    // ν•¨μˆ˜ λ‚΄μš©
}



캑처 λ¦¬μŠ€νŠΈ: ν•¨μˆ˜ μ™ΈλΆ€μ˜ λ³€μˆ˜λ₯Ό ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μΊ‘μ²˜ν•˜λŠ” λͺ©λ‘μž…λ‹ˆλ‹€.
λ§€κ°œλ³€μˆ˜ λ¦¬μŠ€νŠΈ: ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.
λ°˜ν™˜ν˜•: ν•¨μˆ˜μ˜ λ°˜ν™˜ν˜•μ„ μ„ μ–Έν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€. μƒλž΅ κ°€λŠ₯ν•˜λ©°, μ»΄νŒŒμΌλŸ¬κ°€ λ°˜ν™˜ν˜•μ„ μΆ”λ‘ ν•©λ‹ˆλ‹€.
{} μ•ˆμ—λŠ” λžŒλ‹€ ν•¨μˆ˜μ˜ λ™μž‘을 κ΅¬ν˜„ν•˜λŠ” μ½”λ“œκ°€ λ“€μ–΄κ°‘λ‹ˆλ‹€.


λžŒλ‹€ ν•¨μˆ˜λŠ” μ£Όλ‘œ find_if와 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ μ§§κ³  κ°„λ‹¨ν•œ μ‘°κ±΄ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” λ° μœ μš©ν•©λ‹ˆλ‹€.

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};


	// λžŒλ‹€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 짝수λ₯Ό μ°ΎλŠ” Predicateλ₯Ό 생성
    auto it = std::find_if(numbers.begin(), numbers.end(), [](int num) 
    	{ return num % 2 == 0; });
    

    if (it != numbers.end()) {
        std::cout << "First even number: " << *it << std::endl;
    } else {
        std::cout << "No even number found." << std::endl;
    }

    return 0;
}

μœ„ μ˜ˆμ‹œμ—μ„œ 읡λͺ… λžŒλ‹€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ Predicateλ₯Ό μƒμ„±ν•˜κ³ , find_if에 이 Predicateλ₯Ό μ „λ‹¬ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆμ—μ„œ 첫 번째 짝수λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ Predicate와 λžŒλ‹€ ν•¨μˆ˜λ₯Ό μ‘°ν•©ν•˜λ©΄ ν•„μš”μ— 따라 λ‹€μ–‘ν•œ 쑰건으둜 μ»¨ν…Œμ΄λ„ˆμ˜ μ›μ†Œλ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€