์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿงฐ STL ์•Œ๊ณ ๋ฆฌ์ฆ˜ 3๋Œ€์žฅ: sort, find, transform ์ œ๋Œ€๋กœ ์จ๋จน๊ธฐ

๐Ÿงฐ STL ์•Œ๊ณ ๋ฆฌ์ฆ˜ 3๋Œ€์žฅ: sort, find, transform ์ œ๋Œ€๋กœ ์จ๋จน๊ธฐ

์•ผ, ๋„ˆ ํ˜น์‹œ ์•„์ง๋„ ๋ฐฐ์—ด ์ •๋ ฌํ•˜๋ ค๊ณ  ๋ฒ„๋ธ” ์ •๋ ฌ for๋ฌธ ๋‘ ๊ฒน ์งœ๊ณ  ์žˆ์–ด? ์•„๋‹ˆ๋ฉด ๋ฒกํ„ฐ์—์„œ ๊ฐ’ ํ•˜๋‚˜ ์ฐพ์œผ๋ ค๊ณ  for (int i = 0; ...) ๋Œ๋ฆฌ๋ฉด์„œ flag = true ์„ธ์šฐ๊ณ  ์žˆ์ง„ ์•Š๊ณ ? ๐Ÿ˜…
๊ดœ์ฐฎ์•„, ๋‹ค๋“ค ๊ทธ๋ ‡๊ฒŒ ์‹œ์ž‘ํ•ด. ๊ทผ๋ฐ C++์—๋Š” ์ด๋ฏธ ๊ฒ€์ฆ๋œ ๊ณ ์„ฑ๋Šฅ ๋„๊ตฌ ์ƒ์ž๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ๋“ค์–ด ์žˆ์–ด. ๊ทธ๊ฒŒ ๋ฐ”๋กœ STL ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์•ผ.

์˜ค๋Š˜์€ ๊ทธ์ค‘์—์„œ๋„ ์‹ค๋ฌด์™€ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ์“ฐ๋Š” 3๋Œ€์žฅ, std::sort, std::find, std::transform์„ ์นœ๊ตฌํ•œํ…Œ ์„ค๋ช…ํ•˜๋“ฏ ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณผ ๊ฑฐ์•ผ. ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ฐ™์€ ํŒฉํŠธ๋„ ์ •ํ™•ํžˆ ์ฑ™๊ธฐ๊ณ , ํ”ํžˆ ๋ฐŸ๋Š” ์ง€๋ขฐ๋„ ๊ฐ™์ด ํ”ผํ•ด๊ฐ€ ๋ณด์ž๊ณ .

STL ์•Œ๊ณ ๋ฆฌ์ฆ˜ 3๋Œ€์žฅ ๋ฐ˜๋ณต์ž [first, last) ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋„๊ตฌ๋“ค sort ์ •๋ ฌ O(N log N) find 3 8 5 1 ์„ ํ˜• ํƒ์ƒ‰ O(N) transform 1 2 3 ร—2 โžœ 2 4 6 ๋ณ€ํ™˜ O(N) ํ—ค๋”๋Š” ๋ชจ๋‘ <algorithm>

๐Ÿง  ๋จผ์ € STL ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฒ ํ•™๋ถ€ํ„ฐ

STL(Standard Template Library)์€ ํฌ๊ฒŒ ์ปจํ…Œ์ด๋„ˆ(vector, list, map ๋“ฑ), ๋ฐ˜๋ณต์ž(iterator), ์•Œ๊ณ ๋ฆฌ์ฆ˜(sort, find ๋“ฑ) ์„ธ ์ถ•์œผ๋กœ ์ด๋ค„์ ธ ์žˆ์–ด. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ ํฌ์ธํŠธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง์ ‘ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฑฐ์•ผ.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์˜ค์ง ๋ฐ˜๋ณต์ž ํ•œ ์Œ๋งŒ ๋ฐ›์•„. ๋ณดํ†ต first์™€ last์ธ๋ฐ, ๋ฒ”์œ„๋Š” ๋ฐ˜์—ด๋ฆฐ ๊ตฌ๊ฐ„ [first, last)์•ผ. ์ฆ‰ first๋Š” ํฌํ•จ, last๋Š” ํฌํ•จํ•˜์ง€ ์•Š์•„. ๊ทธ๋ž˜์„œ v.end()๋Š” ๋งˆ์ง€๋ง‰ ์›์†Œ "๋‹ค์Œ" ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฑฐ๊ณ .
์ด ์„ค๊ณ„ ๋•๋ถ„์— ๊ฐ™์€ std::find๋ฅผ vector, list, deque, ์‹ฌ์ง€์–ด ์ผ๋ฐ˜ C ๋ฐฐ์—ด(ํฌ์ธํ„ฐ๋„ ๋ฐ˜๋ณต์ž์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋‹ˆ๊นŒ)์—๋„ ์“ธ ์ˆ˜ ์žˆ์–ด. ์ปจํ…Œ์ด๋„ˆ N๊ฐœ ร— ์•Œ๊ณ ๋ฆฌ์ฆ˜ M๊ฐœ๋ฅผ Nร—M๋ฒˆ ๊ตฌํ˜„ํ•  ํ•„์š” ์—†์ด N+M์œผ๋กœ ๋๋‚˜๋Š” ๊ฑฐ์ง€. ์ด๊ฒŒ ๋ฐ”๋กœ ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋งค๋ ฅ์ด์•ผ. โœจ

๐Ÿ’ก ๊ธฐ์–ตํ•  ํ•œ ์ค„: "์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋ณต์ž๋กœ ๋งํ•˜๊ณ , ๋ฒ”์œ„๋Š” [first, last)๋‹ค." ์ด๊ฑฐ ํ•˜๋‚˜๋งŒ ๋จธ๋ฆฌ์— ๋ฐ•์•„๋‘ฌ๋„ STL ์ ˆ๋ฐ˜์€ ์ดํ•ดํ•œ ๊ฑฐ์•ผ.

๐Ÿ“Š 1. std::sort โ€” ์ •๋ ฌ์€ ๊ทธ๋ƒฅ ์ด๊ฑฐ ์“ฐ๋ฉด ๋ผ

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

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

int main() {
    std::vector<int> v = {5, 2, 9, 1, 7};
    std::sort(v.begin(), v.end());          // ์˜ค๋ฆ„์ฐจ์ˆœ: 1 2 5 7 9
    for (int x : v) std::cout << x << ' ';
}

๊ธฐ๋ณธ ๋น„๊ต๋Š” operator<์•ผ. ๊ทธ๋ž˜์„œ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋„˜๊ธฐ๋ฉด ์˜ค๋ฆ„์ฐจ์ˆœ์ด ๋ผ. ๋‚ด๋ฆผ์ฐจ์ˆœ์€ ๋น„๊ต ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋.

std::sort(v.begin(), v.end(), std::greater<int>());   // 9 7 5 2 1
// C++14๋ถ€ํ„ฐ๋Š” std::greater<>() ์ฒ˜๋Ÿผ ํƒ€์ž… ์ƒ๋žต ๊ฐ€๋Šฅ
std::sort(v.rbegin(), v.rend());   // ์—ญ๋ฐฉํ–ฅ ๋ฐ˜๋ณต์ž๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ = ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ

์„ฑ๋Šฅ ํŒฉํŠธ: ์–ผ๋งˆ๋‚˜ ๋นจ๋ผ?

C++11 ํ‘œ์ค€๋ถ€ํ„ฐ std::sort๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ O(N log N) ๋ฒˆ์˜ ๋น„๊ต๋ฅผ ๋ณด์žฅํ•˜๋„๋ก ๊ทœ์ •๋ผ ์žˆ์–ด. (C++03 ์‹œ์ ˆ์—” "ํ‰๊ท " O(N log N)๋งŒ ์š”๊ตฌํ–ˆ์—ˆ์–ด.)
๊ทธ๋ž˜์„œ ์ฃผ์š” ๊ตฌํ˜„์ฒด(GCC์˜ libstdc++, LLVM์˜ libc++, MSVC STL)๋Š” ๋ณดํ†ต ์ธํŠธ๋กœ์†ŒํŠธ(Introsort)๋ฅผ ์จ. ํ€ต์†ŒํŠธ๋กœ ๋‹ฌ๋ฆฌ๋‹ค๊ฐ€ ์žฌ๊ท€ ๊นŠ์ด๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์–ด์ง€๋ฉด ํž™์†ŒํŠธ๋กœ ๊ฐˆ์•„ํƒ€๊ณ , ๊ตฌ๊ฐ„์ด ์ž‘์•„์ง€๋ฉด ์‚ฝ์ž… ์ •๋ ฌ๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์ด์•ผ. ํ€ต์†ŒํŠธ์˜ ํ‰๊ท  ์†๋„ + ํž™์†ŒํŠธ์˜ ์ตœ์•… ๋ณด์žฅ, ๋‘˜ ๋‹ค ์ฑ™๊ธฐ๋Š” ์˜๋ฆฌํ•œ ๋…€์„์ด์ง€. ๐Ÿ˜Ž

โš ๏ธ ์š”๊ตฌ ์กฐ๊ฑด: std::sort๋Š” ๋žœ๋ค ์•ก์„ธ์Šค ๋ฐ˜๋ณต์ž๊ฐ€ ํ•„์š”ํ•ด. ๊ทธ๋ž˜์„œ std::list์—๋Š” ๋ชป ์จ! list๋Š” ์ž์ฒด ๋ฉค๋ฒ„ ํ•จ์ˆ˜ lst.sort()๋ฅผ ์จ์•ผ ํ•ด. std::sort(lst.begin(), lst.end()) ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๊ธธ๊ฒŒ ์Ÿ์•„์งˆ ๊ฑฐ์•ผ.

๋žŒ๋‹ค๋กœ ์ปค์Šคํ…€ ์ •๋ ฌํ•˜๊ธฐ

์‹ค์ „์—์„  ๊ตฌ์กฐ์ฒด๋ฅผ ์ •๋ ฌํ•˜๋Š” ์ผ์ด ํ›จ์”ฌ ๋งŽ์•„. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•™์ƒ์„ ์ ์ˆ˜ ๋‚ด๋ฆผ์ฐจ์ˆœ, ์ ์ˆ˜๊ฐ€ ๊ฐ™์œผ๋ฉด ์ด๋ฆ„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด๋ณด์ž.

struct Student {
    std::string name;
    int score;
};

std::vector<Student> s = {{"๋ฏผ์ˆ˜", 90}, {"์ง€์˜", 95}, {"์ฒ ์ˆ˜", 90}};

std::sort(s.begin(), s.end(), [](const Student& a, const Student& b) {
    if (a.score != b.score) return a.score > b.score;  // ์ ์ˆ˜ ๋‚ด๋ฆผ์ฐจ์ˆœ
    return a.name < b.name;                            // ์ด๋ฆ„ ์˜ค๋ฆ„์ฐจ์ˆœ
});

๋” ๊น”๋”ํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด std::tie๋ฅผ ์“ฐ๋Š” ํŠธ๋ฆญ๋„ ์žˆ์–ด. ํŠœํ”Œ๋ผ๋ฆฌ ์‚ฌ์ „์ˆœ ๋น„๊ต๋ฅผ ํ•ด์ฃผ๊ฑฐ๋“ .

#include <tuple>
std::sort(s.begin(), s.end(), [](const Student& a, const Student& b) {
    return std::tie(b.score, a.name) < std::tie(a.score, b.name);
});

์ ์ˆ˜ ์ชฝ๋งŒ a, b ์ˆœ์„œ๋ฅผ ๋’ค์ง‘์–ด์„œ ๋‚ด๋ฆผ์ฐจ์ˆœ์„ ๋งŒ๋“  ๊ฑฐ์•ผ. ์ฒ˜์Œ์—” ํ—ท๊ฐˆ๋ฆฌ๋Š”๋ฐ ์ต์ˆ™ํ•ด์ง€๋ฉด ์€๊ทผ ์ค‘๋…๋ผ. ๐Ÿค“

๐Ÿšจ ๊ฐ€์žฅ ๋ฌด์„œ์šด ์ง€๋ขฐ: Strict Weak Ordering

๋น„๊ต ํ•จ์ˆ˜๋Š” ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์งœ๋ฉด ์•ˆ ๋ผ. ํ‘œ์ค€์€ ๋น„๊ต ํ•จ์ˆ˜๊ฐ€ ์—„๊ฒฉํ•œ ์•ฝ์ˆœ์„œ(strict weak ordering)๋ฅผ ๋งŒ์กฑํ•˜๋ผ๊ณ  ์š”๊ตฌํ•ด. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์ด๊ฑฐ์•ผ:

โ‘  ๋น„๋ฐ˜์‚ฌ์„ฑ: comp(a, a)๋Š” ํ•ญ์ƒ false
โ‘ก ๋น„๋Œ€์นญ์„ฑ: comp(a, b)๊ฐ€ true๋ฉด comp(b, a)๋Š” false
โ‘ข ์ถ”์ด์„ฑ: comp(a, b), comp(b, c)๊ฐ€ true๋ฉด comp(a, c)๋„ true
โ‘ฃ ๋™๋“ฑ์„ฑ์˜ ์ถ”์ด์„ฑ: a์™€ b๊ฐ€ ๋™๋“ฑ, b์™€ c๊ฐ€ ๋™๋“ฑํ•˜๋ฉด a์™€ c๋„ ๋™๋“ฑ

์ œ์ผ ํ”ํ•œ ์‹ค์ˆ˜๊ฐ€ return a <= b;์•ผ. ์ด๋Ÿฌ๋ฉด comp(a, a)๊ฐ€ true๊ฐ€ ๋ผ์„œ โ‘ ๋ฒˆ์„ ๊นจ๋œจ๋ ค. ๊ฒฐ๊ณผ๋Š”? ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘(UB)์ด์•ผ. ์ •๋ ฌ์ด ์ด์ƒํ•˜๊ฒŒ ๋˜๊ฑฐ๋‚˜, ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋ฐฐ์—ด ๋ฒ”์œ„๋ฅผ ๋„˜์–ด ์ฝ๋‹ค๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์ด ํ„ฐ์งˆ ์ˆ˜๋„ ์žˆ์–ด. ์‹ค์ œ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ "๋กœ์ปฌ์—์„  ๋˜๋Š”๋ฐ ์ œ์ถœํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ" ๋‚˜๋Š” ๋‹จ๊ณจ ์›์ธ์ด ์ด๊ฑฐ์•ผ.

๐Ÿ’ก ๋น„๊ต ํ•จ์ˆ˜์—” < ๋˜๋Š” >๋งŒ ์จ. <=, >=๋Š” ๊ธˆ์ง€! ๊ทธ๋ฆฌ๊ณ  ๋น„๊ต ๋Œ€์ƒ์ด ๋ถ€๋™์†Œ์ˆ˜์ ์ด๋ผ๋ฉด NaN์ด ๋ผ์–ด ์žˆ์„ ๋•Œ ์ˆœ์„œ๊ฐ€ ๊นจ์ง„๋‹ค๋Š” ๊ฒƒ๋„ ๊ธฐ์–ตํ•ด๋‘ฌ.

sort์˜ ์นœ์ฒ™๋“ค

ํ•จ์ˆ˜ํ•˜๋Š” ์ผ๋ณต์žก๋„
std::sort์ „์ฒด ์ •๋ ฌ (๋ถˆ์•ˆ์ •)O(N log N)
std::stable_sort๊ฐ™์€ ๊ฐ’์˜ ์›๋ž˜ ์ˆœ์„œ ์œ ์ง€๋ฉ”๋ชจ๋ฆฌ ์ถฉ๋ถ„ ์‹œ O(N log N), ๋ถ€์กฑ ์‹œ O(N logยฒ N)
std::partial_sort์•ž์ชฝ K๊ฐœ๋งŒ ์ •๋ ฌ์•ฝ O(N log K)
std::nth_elementN๋ฒˆ์งธ ์›์†Œ๋งŒ ์ œ์ž๋ฆฌ์—ํ‰๊ท  O(N)
std::is_sorted์ •๋ ฌ ์—ฌ๋ถ€ ํ™•์ธO(N)

์•ˆ์ • ์ •๋ ฌ(stable)์ด ๋ญ๋ƒ๋ฉด, ๊ฐ’์ด ๊ฐ™์€ ์›์†Œ๋“ค์˜ ๊ธฐ์กด ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ ํ›„์—๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๋Š” ์„ฑ์งˆ์ด์•ผ. std::sort๋Š” ์ด๊ฑธ ๋ณด์žฅํ•˜์ง€ ์•Š์•„. ์˜ˆ๋ฅผ ๋“ค์–ด "์ด๋ฏธ ์ด๋ฆ„์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ ์ˆ˜์ˆœ์œผ๋กœ ๋‹ค์‹œ ์ •๋ ฌํ•˜๋˜, ๋™์ ์ž๋Š” ์ด๋ฆ„์ˆœ ์œ ์ง€" ๊ฐ™์€ ์š”๊ตฌ๋ผ๋ฉด std::stable_sort๊ฐ€ ์ •๋‹ต์ด์•ผ.

๊ทธ๋ฆฌ๊ณ  "์ƒ์œ„ 10๋ช…๋งŒ ํ•„์š”ํ•ด!" ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ฐฑ๋งŒ ๊ฐœ ์ „์ฒด๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฑด ๋‚ญ๋น„์•ผ. ์ด๋Ÿด ๋• partial_sort, ์ค‘์•™๊ฐ’ ํ•˜๋‚˜๋งŒ ํ•„์š”ํ•˜๋ฉด nth_element. ๋„๊ตฌ๋ฅผ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ณ ๋ฅด๋Š” ๊ฒŒ ์ง„์งœ ๊ณ ์ˆ˜์˜ ๊ฐ๊ฐ์ด์ง€.

std::vector<int> v = {9, 4, 7, 1, 8, 2, 6};
std::partial_sort(v.begin(), v.begin() + 3, v.end());   // ์•ž 3๊ฐœ: 1 2 4 (๋‚˜๋จธ์ง€๋Š” ์ˆœ์„œ ๋ฏธ์ •)

std::nth_element(v.begin(), v.begin() + v.size()/2, v.end());
int median = v[v.size()/2];   // ์ค‘์•™๊ฐ’ 6

๐Ÿ” 2. std::find โ€” ์ฐพ์•„๋ผ, ๊ทธ ์›์†Œ๋ฅผ!

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

std::find๋Š” ๋ฒ”์œ„๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ํ›‘์œผ๋ฉด์„œ ๊ฐ’์ด ๊ฐ™์€(==) ์ฒซ ๋ฒˆ์งธ ์›์†Œ์˜ ๋ฐ˜๋ณต์ž๋ฅผ ๋Œ๋ ค์ค˜. ๋ชป ์ฐพ์œผ๋ฉด? last๋ฅผ ๋Œ๋ ค์ค˜. nullptr๋„ -1๋„ ์•„๋‹ˆ์•ผ. ์ด๊ฒŒ ์ง„์งœ ์ค‘์š”ํ•ด!

std::vector<int> v = {3, 8, 5, 1, 5};

auto it = std::find(v.begin(), v.end(), 5);
if (it != v.end()) {
    std::cout << "์ฐพ์Œ! ์ธ๋ฑ์Šค: " << std::distance(v.begin(), it);  // 2
} else {
    std::cout << "์—†์Œ";
}

๋ฐ˜๋ณต์ž์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์–ป๊ณ  ์‹ถ์„ ๋• std::distance(v.begin(), it) ๋˜๋Š” vector์ฒ˜๋Ÿผ ๋žœ๋ค ์•ก์„ธ์Šค๋ผ๋ฉด it - v.begin()์„ ์“ฐ๋ฉด ๋ผ.

โš ๏ธ ์ ˆ๋Œ€ ํ•˜์ง€ ๋งˆ: ๋ชป ์ฐพ์•˜๋Š”์ง€ ํ™•์ธ ์•ˆ ํ•˜๊ณ  *it๋ฅผ ์—ญ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ. end()๋ฅผ ์—ญ์ฐธ์กฐํ•˜๋Š” ๊ฑด UB์•ผ. "์ฐพ์•˜๊ฒ ์ง€~" ํ•˜๋Š” ์ˆœ๊ฐ„ ๋ฒ„๊ทธ๊ฐ€ ์ฐพ์•„์˜จ๋‹ค. ๐Ÿ˜ฑ

find์˜ ๊ฐ€์กฑ: find_if, find_if_not

"ํŠน์ • ๊ฐ’"์ด ์•„๋‹ˆ๋ผ "์กฐ๊ฑด"์œผ๋กœ ์ฐพ๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ๋” ๋งŽ์ž–์•„? ๊ทธ๋Ÿด ๋• find_if์•ผ.

// ์ฒซ ๋ฒˆ์งธ ์ง์ˆ˜ ์ฐพ๊ธฐ
auto it = std::find_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; });

// ์ ์ˆ˜ 90์  ์ด์ƒ์ธ ์ฒซ ํ•™์ƒ ์ฐพ๊ธฐ
auto st = std::find_if(s.begin(), s.end(),
                       [](const Student& a) { return a.score >= 90; });

// ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ "์•Š๋Š”" ์ฒซ ์›์†Œ (C++11)
auto it2 = std::find_if_not(v.begin(), v.end(), [](int x) { return x > 0; });

์ฐธ๊ณ ๋กœ ๋‹จ์ˆœํžˆ "์žˆ๋ƒ ์—†๋ƒ"๋งŒ ๊ถ๊ธˆํ•˜๋ฉด std::any_of, std::all_of, std::none_of๊ฐ€ ์˜๋„๋ฅผ ๋” ์ž˜ ๋“œ๋Ÿฌ๋‚ด. ๊ฐœ์ˆ˜๊ฐ€ ๊ถ๊ธˆํ•˜๋ฉด std::count / std::count_if.

์„ฑ๋Šฅ ํŒฉํŠธ: find๋Š” ์–ธ์ œ ์“ฐ๋ฉด ์•ˆ ๋ ๊นŒ?

std::find๋Š” ์„ ํ˜• ํƒ์ƒ‰์ด๋ผ ์ตœ๋Œ€ N๋ฒˆ ๋น„๊ตํ•ด. ์ฆ‰ O(N). ์›์†Œ๊ฐ€ ๋ช‡ ๊ฐœ ์•ˆ ๋˜๊ฑฐ๋‚˜ ํ•œ๋‘ ๋ฒˆ๋งŒ ์ฐพ์„ ๋• ์ด๊ฒŒ ์ตœ๊ณ ์•ผ. ๊ทผ๋ฐ ํฐ ๋ฐ์ดํ„ฐ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–˜๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ ธ.

๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ณ„ ์ตœ๋Œ€ ๋น„๊ต ํšŸ์ˆ˜ ๋น„๊ต ํšŸ์ˆ˜ find: N๋ฒˆ binary_search: logโ‚‚N ์›์†Œ ๊ฐœ์ˆ˜ N โ†’ N=1,000,000์ผ ๋•Œ ์•ฝ 100๋งŒ ๋ฒˆ vs ์•ฝ 20๋ฒˆ

๋ฐฑ๋งŒ ๊ฐœ๋ฉด logโ‚‚(1,000,000) โ‰ˆ 19.9๋‹ˆ๊นŒ ์ด์ง„ ํƒ์ƒ‰์€ ์•ฝ 20๋ฒˆ์ด๋ฉด ๋๋‚˜. ์ฐจ์ด๊ฐ€ ์—„์ฒญ๋‚˜์ง€? ๊ทธ๋ž˜์„œ ์ƒํ™ฉ๋ณ„๋กœ ์ด๋ ‡๊ฒŒ ๊ณจ๋ผ ์จ.

์ •๋ ฌ ์•ˆ ๋จ ยท ๊ฐ€๋” ๊ฒ€์ƒ‰
std::find
O(N). ์ค€๋น„ ๋น„์šฉ 0. ๊ฐ€์žฅ ๊ฐ„๋‹จ.
์ •๋ ฌ๋จ ยท ์ž์ฃผ ๊ฒ€์ƒ‰
binary_search / lower_bound
O(log N). ๋‹จ, ๋ฏธ๋ฆฌ ์ •๋ ฌ(O(N log N)) ํ•„์š”.
์‚ฝ์ž…ยท๊ฒ€์ƒ‰ ๋ฐ˜๋ณต
std::set / unordered_set
set์€ O(log N), unordered_set์€ ํ‰๊ท  O(1).
std::sort(v.begin(), v.end());
bool exists = std::binary_search(v.begin(), v.end(), 5);   // true/false๋งŒ ๋ฐ˜ํ™˜

auto lb = std::lower_bound(v.begin(), v.end(), 5);   // 5 ์ด์ƒ์ธ ์ฒซ ์œ„์น˜
auto ub = std::upper_bound(v.begin(), v.end(), 5);   // 5 ์ดˆ๊ณผ์ธ ์ฒซ ์œ„์น˜
auto cnt = ub - lb;                                   // 5์˜ ๊ฐœ์ˆ˜
๐Ÿ’ก ๊ฟ€ํŒ: std::set์ด๋‚˜ std::map์—์„œ๋Š” std::find(s.begin(), s.end(), x) ๋ง๊ณ  ๋ฉค๋ฒ„ ํ•จ์ˆ˜ s.find(x)๋ฅผ ์จ! ์ „์—ญ std::find๋Š” O(N)์œผ๋กœ ๋‹ค ํ›‘์ง€๋งŒ, ๋ฉค๋ฒ„ find๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด O(log N)์ด์•ผ. C++20๋ถ€ํ„ฐ๋Š” s.contains(x)๋„ ์žˆ์–ด์„œ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ์ด ๋” ๊น”๋”ํ•ด์กŒ๊ณ .

๋ฌธ์ž์—ด์—์„œ๋„ ์“ธ ์ˆ˜ ์žˆ์–ด

std::string str = "hello world";
auto it = std::find(str.begin(), str.end(), 'w');   // 'w' ์œ„์น˜
// ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์€ std::string::find ๋ฉค๋ฒ„๋‚˜ std::search๊ฐ€ ์ ํ•ฉ

๐Ÿ”„ 3. std::transform โ€” ๋ฐ์ดํ„ฐ ๋ณ€์‹  ๊ณต์žฅ

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• (๋‹จํ•ญ ๋ฒ„์ „)

std::transform์€ ๋ฒ”์œ„์˜ ๊ฐ ์›์†Œ์— ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ ์œ„์น˜์— ์จ. ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์˜ map์ด๋ž‘ ๊ฐ™์€ ๊ฐœ๋…์ด์•ผ. ํŒŒ์ด์ฌ์˜ map()์ด๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ array.map() ์จ๋ดค์œผ๋ฉด ๋ฐ”๋กœ ๊ฐ ์˜ฌ ๊ฑฐ์•ผ.

std::vector<int> v = {1, 2, 3, 4};
std::vector<int> out(v.size());     // ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ํ™•๋ณด!

std::transform(v.begin(), v.end(), out.begin(),
               [](int x) { return x * x; });   // out = 1 4 9 16

๋ฐ˜ํ™˜๊ฐ’์€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์“ด ์›์†Œ ๋‹ค์Œ ์œ„์น˜์˜ ์ถœ๋ ฅ ๋ฐ˜๋ณต์ž์•ผ. ์ด์–ด์„œ ๋ญ”๊ฐ€๋ฅผ ๋” ์“ฐ๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ด.

๐Ÿšจ ์ง€๋ขฐ: ์ถœ๋ ฅ ๊ณต๊ฐ„ ํ™•๋ณด

์ œ์ผ ๋งŽ์ด ํ•˜๋Š” ์‹ค์ˆ˜๊ฐ€ ์ด๊ฑฐ์•ผ.

std::vector<int> out;   // ๋น„์–ด ์žˆ์Œ!
std::transform(v.begin(), v.end(), out.begin(), f);   // โŒ UB! ๋นˆ ๊ณต๊ฐ„์— ์“ฐ๊ธฐ

transform์€ ๊ณต๊ฐ„์„ ์•Œ์•„์„œ ๋Š˜๋ ค์ฃผ์ง€ ์•Š์•„. ๊ทธ๋ƒฅ ์ฃผ์–ด์ง„ ์œ„์น˜์— ๋ฎ์–ด์“ธ ๋ฟ์ด์•ผ. ํ•ด๊ฒฐ์ฑ…์€ ๋‘ ๊ฐ€์ง€.

// ๋ฐฉ๋ฒ• 1: ํฌ๊ธฐ ๋ฏธ๋ฆฌ ํ™•๋ณด
std::vector<int> out(v.size());
std::transform(v.begin(), v.end(), out.begin(), f);

// ๋ฐฉ๋ฒ• 2: back_inserter๋กœ push_back ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ
#include <iterator>
std::vector<int> out2;
out2.reserve(v.size());   // ์žฌํ• ๋‹น ์ค„์ด๊ธฐ์šฉ (์„ ํƒ)
std::transform(v.begin(), v.end(), std::back_inserter(out2), f);

์ œ์ž๋ฆฌ ๋ณ€ํ™˜ (in-place)

์ถœ๋ ฅ ์œ„์น˜๋ฅผ ์ž…๋ ฅ์˜ ์‹œ์ž‘์œผ๋กœ ์ฃผ๋ฉด ์›๋ณธ์„ ๊ทธ๋Œ€๋กœ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์–ด. ํ‘œ์ค€์ด ์ด๊ฑธ ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ•ด.

std::transform(v.begin(), v.end(), v.begin(), [](int x) { return x * 2; });

์ดํ•ญ ๋ฒ„์ „: ๋‘ ๋ฒ”์œ„๋ฅผ ํ•ฉ์น˜๊ธฐ

์ž…๋ ฅ ๋ฒ”์œ„๋ฅผ ๋‘ ๊ฐœ ๋ฐ›์•„์„œ ์›์†Œ ์Œ๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฒ„์ „๋„ ์žˆ์–ด.

์ดํ•ญ transform: a[i] + b[i] a 1 2 3 b 10 20 30 out 11 22 33 +
std::vector<int> a = {1, 2, 3};
std::vector<int> b = {10, 20, 30};
std::vector<int> out(a.size());

std::transform(a.begin(), a.end(), b.begin(), out.begin(), std::plus<>());
// out = 11 22 33
โš ๏ธ ๋‘ ๋ฒˆ์งธ ๋ฒ”์œ„๋Š” ์‹œ์ž‘ ๋ฐ˜๋ณต์ž๋งŒ ๋ฐ›์•„. ๊ทธ๋ž˜์„œ b๊ฐ€ a๋ณด๋‹ค ์งง์œผ๋ฉด ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ ์ฝ๋Š” UB๊ฐ€ ๋ผ. ๊ธธ์ด ํ™•์ธ์€ ๋„ค ๋ชซ์ด์•ผ!

์‹ค์ „ ์˜ˆ์ œ: ๋ฌธ์ž์—ด ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜

์ด๊ฑฐ ์ง„์งœ ์ž์ฃผ ์“ฐ๋Š”๋ฐ, ์ˆจ์€ ํ•จ์ •์ด ํ•˜๋‚˜ ์žˆ์–ด.

#include <cctype>
std::string s = "Hello STL";

// โŒ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Œ
// std::transform(s.begin(), s.end(), s.begin(), ::toupper);

// โœ… ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•
std::transform(s.begin(), s.end(), s.begin(),
               [](unsigned char c) { return std::toupper(c); });

์™œ ๊ตณ์ด unsigned char๋กœ ๋ฐ›๋ƒ๊ณ ? std::toupper๋Š” ์ธ์ž๊ฐ€ unsigned char๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๊ฑฐ๋‚˜ EOF์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ๊ทœ์ •๋ผ ์žˆ์–ด. ๊ทธ๋Ÿฐ๋ฐ char๊ฐ€ signed์ธ ํ™˜๊ฒฝ(x86์˜ ๋Œ€๋ถ€๋ถ„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๋ž˜)์—์„œ ํ•œ๊ธ€ ๊ฐ™์€ ๋ฉ€ํ‹ฐ๋ฐ”์ดํŠธ ๋ฌธ์ž์˜ ๋ฐ”์ดํŠธ๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๊ฑธ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๋ฉด UB์•ผ. ๊ฒŒ๋‹ค๊ฐ€ std::toupper๋Š” <locale>์— ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์žˆ์–ด์„œ ํ•จ์ˆ˜ ์ด๋ฆ„๋งŒ ๋„˜๊ธฐ๋ฉด ๋ชจํ˜ธ์„ฑ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚  ๋•Œ๋„ ์žˆ๊ณ . ๋žŒ๋‹ค๋กœ ๊ฐ์‹ธ๋ฉด ๋‘ ๋ฌธ์ œ๊ฐ€ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐ๋ผ. ๐Ÿ‘

ํƒ€์ž… ๋ณ€ํ™˜๋„ ์ž์œ ์ž์žฌ

std::vector<int> nums = {1, 2, 3};
std::vector<std::string> strs;
std::transform(nums.begin(), nums.end(), std::back_inserter(strs),
               [](int n) { return "#" + std::to_string(n); });
// strs = "#1" "#2" "#3"

// ๊ตฌ์กฐ์ฒด์—์„œ ํŠน์ • ํ•„๋“œ๋งŒ ๋ฝ‘๊ธฐ
std::vector<std::string> names;
std::transform(s_list.begin(), s_list.end(), std::back_inserter(names),
               [](const Student& st) { return st.name; });
๐Ÿ’ก transform vs for_each: ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กœ "๋งŒ๋“ค์–ด์„œ ์–ด๋”˜๊ฐ€์— ์“ฐ๋Š”" ๊ฒŒ ๋ชฉ์ ์ด๋ฉด transform, ๊ฐ ์›์†Œ์— "๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋Š”"(์ถœ๋ ฅ, ๋ˆ„์ , ์ˆ˜์ •) ๊ฒŒ ๋ชฉ์ ์ด๋ฉด std::for_each๊ฐ€ ์˜๋„๋ฅผ ๋” ์ž˜ ๋“œ๋Ÿฌ๋‚ด. ๊ทธ๋ฆฌ๊ณ  ํ‘œ์ค€์€ transform์— ๋„˜๊ธด ํ•จ์ˆ˜๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ๋œ๋‹ค๊ณ  ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋‹ˆ ๋ถ€์ˆ˜ํšจ๊ณผ(side effect)์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๋Š” ํ”ผํ•˜์ž.

๐Ÿงฉ ์„ธ ๋…€์„ ํ•ฉ์ฒด! ์‹ค์ „ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ

์ด์ œ ๋ฐฐ์šด ๊ฑธ ํ•œ ๋ฒˆ์— ์จ๋ณด์ž. ์ƒํ™ฉ: ์‡ผํ•‘๋ชฐ ์ƒํ’ˆ ๋ชฉ๋ก์—์„œ ๊ฐ€๊ฒฉ์— ํ• ์ธ์œจ ์ ์šฉ โ†’ ๊ฐ€๊ฒฉ์ˆœ ์ •๋ ฌ โ†’ ํŠน์ • ์ƒํ’ˆ ์ฐพ๊ธฐ.

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

struct Item {
    std::string name;
    double price;
};

int main() {
    std::vector<Item> items = {
        {"ํ‚ค๋ณด๋“œ", 50000}, {"๋งˆ์šฐ์Šค", 20000},
        {"๋ชจ๋‹ˆํ„ฐ", 200000}, {"ํ—ค๋“œ์…‹", 80000}
    };

    // 1) transform: ์ „ ์ƒํ’ˆ 10% ํ• ์ธ (์ œ์ž๋ฆฌ ๋ณ€ํ™˜)
    std::transform(items.begin(), items.end(), items.begin(),
                   [](Item it) { it.price *= 0.9; return it; });

    // 2) sort: ๊ฐ€๊ฒฉ ์˜ค๋ฆ„์ฐจ์ˆœ
    std::sort(items.begin(), items.end(),
              [](const Item& a, const Item& b) { return a.price < b.price; });

    // 3) find_if: 10๋งŒ ์› ์ด์ƒ์ธ ์ฒซ ์ƒํ’ˆ
    auto it = std::find_if(items.begin(), items.end(),
                           [](const Item& i) { return i.price >= 100000; });

    if (it != items.end())
        std::cout << "๊ณ ๊ฐ€ ์ฒซ ์ƒํ’ˆ: " << it->name << " (" << it->price << "์›)\n";
    // ์ถœ๋ ฅ: ๊ณ ๊ฐ€ ์ฒซ ์ƒํ’ˆ: ๋ชจ๋‹ˆํ„ฐ (180000์›)
}

์ฐธ๊ณ ๋กœ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋‹ˆ๊นŒ 3๋ฒˆ์€ std::partition_point๋‚˜ lower_bound๋กœ O(log N)์— ์ฐพ์„ ์ˆ˜๋„ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ "์•ž ๋‹จ๊ณ„ ๊ฒฐ๊ณผ๋ฅผ ํ™œ์šฉํ•ด ๋‹ค์Œ ๋‹จ๊ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณ ๋ฅด๋Š”" ๊ฐ๊ฐ์ด ์Œ“์ด๋ฉด ์ฝ”๋“œ ๋ฆฌ๋ทฐ์—์„œ ์นญ์ฐฌ๋ฐ›๋Š” ๊ฑฐ์•ผ. ๐Ÿ†

๐Ÿš€ C++20 Ranges: ๋” ์งง๊ณ  ๋” ์•ˆ์ „ํ•˜๊ฒŒ

C++20๋ถ€ํ„ฐ๋Š” std::ranges ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ถ”๊ฐ€๋์–ด. begin(), end()๋ฅผ ์ผ์ผ์ด ์•ˆ ์จ๋„ ๋˜๊ณ , ํ”„๋กœ์ ์…˜(projection)์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋„ ์ƒ๊ฒผ์–ด.

#include <algorithm>
#include <ranges>

std::ranges::sort(v);                               // ๋ฒ”์œ„ ํ†ต์งธ๋กœ
std::ranges::sort(items, {}, &Item::price);         // ํ”„๋กœ์ ์…˜: price ๊ธฐ์ค€ ์ •๋ ฌ
auto it = std::ranges::find(items, "๋งˆ์šฐ์Šค", &Item::name);  // name ํ•„๋“œ๋กœ ๊ฒ€์ƒ‰

// views๋กœ ์ง€์—ฐ ํ‰๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ
auto evens_squared = v
    | std::views::filter([](int x) { return x % 2 == 0; })
    | std::views::transform([](int x) { return x * x; });

ํ”„๋กœ์ ์…˜ ๋•๋ถ„์— "๊ฐ€๊ฒฉ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ" ๊ฐ™์€ ๊ฑธ ๋žŒ๋‹ค ์—†์ด &Item::price ํ•˜๋‚˜๋กœ ๋๋‚ผ ์ˆ˜ ์žˆ์–ด. ๋˜ ranges ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฝ˜์…‰ํŠธ(concepts)๋กœ ์ œ์•ฝ์ด ๊ฑธ๋ ค ์žˆ์–ด์„œ list์— sort๋ฅผ ์“ฐ๋Š” ์‹ค์ˆ˜๋ฅผ ํ•˜๋ฉด ํ›จ์”ฌ ์ฝ๊ธฐ ์‰ฌ์šด ์—๋Ÿฌ๊ฐ€ ๋‚˜์™€. ๊ทธ๋ฆฌ๊ณ  views::transform์€ ์ฆ‰์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๊บผ๋‚ผ ๋•Œ ๊ณ„์‚ฐ(์ง€์—ฐ ํ‰๊ฐ€)ํ•œ๋‹ค๋Š” ์ ์ด std::transform๊ณผ์˜ ํฐ ์ฐจ์ด์•ผ.

โšก ๋ณด๋„ˆ์Šค: ๋ณ‘๋ ฌ ์‹คํ–‰ ์ •์ฑ… (C++17)

C++17๋ถ€ํ„ฐ ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‹คํ–‰ ์ •์ฑ…์„ ์ฒซ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด.

#include <execution>
std::sort(std::execution::par, v.begin(), v.end());
std::transform(std::execution::par_unseq, v.begin(), v.end(), v.begin(), f);

seq(์ˆœ์ฐจ), par(๋ณ‘๋ ฌ), par_unseq(๋ณ‘๋ ฌ+๋ฒกํ„ฐํ™”)๊ฐ€ ์žˆ๊ณ , C++20์—์„  unseq๊ฐ€ ์ถ”๊ฐ€๋์–ด. ๋‹จ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ž‘์œผ๋ฉด ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ๋น„์šฉ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜ ์•ˆ์—์„œ ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑด๋“œ๋ฆฌ๋ฉด ๋ฐ์ดํ„ฐ ๋ ˆ์ด์Šค๊ฐ€ ์ƒ๊ธฐ๋‹ˆ ์กฐ์‹ฌํ•ด. GCC์—์„  ๊ตฌํ˜„์— ๋”ฐ๋ผ Intel TBB ๋งํฌ(-ltbb)๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์–ด.

๐Ÿ“‹ ํ•œ๋ˆˆ์— ์ •๋ฆฌ

sort
โ€ข ๋žœ๋ค ์•ก์„ธ์Šค ๋ฐ˜๋ณต์ž ํ•„์š”
โ€ข C++11๋ถ€ํ„ฐ ์ตœ์•… O(N log N)
โ€ข ๋ถˆ์•ˆ์ • โ†’ ํ•„์š”ํ•˜๋ฉด stable_sort
โ€ข ๋น„๊ต๋Š” < ๋˜๋Š” >๋งŒ!
find
โ€ข ์„ ํ˜• ํƒ์ƒ‰ O(N)
โ€ข ๋ชป ์ฐพ์œผ๋ฉด last ๋ฐ˜ํ™˜
โ€ข ์กฐ๊ฑด ๊ฒ€์ƒ‰์€ find_if
โ€ข set/map์€ ๋ฉค๋ฒ„ find
transform
โ€ข ๋‹จํ•ญ/์ดํ•ญ ๋‘ ๋ฒ„์ „
โ€ข ์ถœ๋ ฅ ๊ณต๊ฐ„ ์ง์ ‘ ํ™•๋ณด
โ€ข back_inserter ํ™œ์šฉ
โ€ข ์ œ์ž๋ฆฌ ๋ณ€ํ™˜ ๊ฐ€๋Šฅ

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ ํ•œ๋งˆ๋””STL ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ๋ฉด ์ฝ”๋“œ๊ฐ€ ์งง์•„์ง€๋Š” ๊ฒƒ ์ด์ƒ์˜ ์ด๋“์ด ์žˆ์–ด. std::find_if๋ผ๋Š” ์ด๋ฆ„ ์ž์ฒด๊ฐ€ "์กฐ๊ฑด์— ๋งž๋Š” ๊ฑธ ์ฐพ๋Š”๋‹ค"๋Š” ์˜๋„๋ฅผ ๋ฌธ์„œ์ฒ˜๋Ÿผ ๋“œ๋Ÿฌ๋‚ด๊ฑฐ๋“ . ์†์œผ๋กœ ์ง  for๋ฌธ์€ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ํ•œ ์ค„์”ฉ ํ•ด์„ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„์€ ํ•œ ๋ฒˆ์— ์ฝํ˜€. ๊ฒŒ๋‹ค๊ฐ€ ์ˆ˜๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฒ€์ฆํ•œ ๊ตฌํ˜„์ด๋ผ ๋ฒ„๊ทธ ๊ฑฑ์ •๋„ ์ค„๊ณ .

์ด๋Ÿฐ C++ ์‹ค๋ ฅ์€ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ, ๊ฒŒ์ž„ ์—”์ง„, ๊ธˆ์œต ์‹œ์Šคํ…œ, ์ž„๋ฒ ๋””๋“œ ๋“ฑ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๋ถ„์•ผ ์–ด๋””์„œ๋“  ํ†ตํ•ด. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ์žฌ๋Šฅ ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์—์„œ๋„ C++ ๊ณผ์™ธ๋‚˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ๋ฉ˜ํ† ๋ง์ฒ˜๋Ÿผ ์ด ์ง€์‹์„ ๋ฐ”๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋งŽ์œผ๋‹ˆ, ์˜ค๋Š˜ ๋ฐฐ์šด 3๋Œ€์žฅ์„ ๊ผญ ์†์— ์ตํ˜€๋‘์ž๊ณ ! ๐Ÿ’ช

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

โ€ข cppreference โ€” std::sort: https://en.cppreference.com/w/cpp/algorithm/sort
โ€ข cppreference โ€” std::find, std::find_if: https://en.cppreference.com/w/cpp/algorithm/find
โ€ข cppreference โ€” std::transform: https://en.cppreference.com/w/cpp/algorithm/transform
โ€ข cppreference โ€” Named requirements: Compare: https://en.cppreference.com/w/cpp/named_req/Compare
โ€ข cppreference โ€” std::toupper: https://en.cppreference.com/w/cpp/string/byte/toupper
โ€ข cppreference โ€” Constrained algorithms (C++20): https://en.cppreference.com/w/cpp/algorithm/ranges

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.