for_each()

algorithmย ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ, ๊ทธ์ค‘์—์„œย for_each()ย ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

#include <algorithm>
 
vector<int> v{1, 2, 3, 4, 5, 6, 7};

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒกํ„ฐ๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์„ ๋•Œ, ๊ฐ ์š”์†Œ์˜ ๊ฐ’์„ ์‹ค์ œ๋กœ 1 ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

๊ฐ๊ฐ์˜ ์š”์†Œ๋ฅผ reference ํ•ด์„œ ๋ถˆ๋Ÿฌ์˜จ ๋’ค, ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๋ฉด ๋  ๊ฒƒ์ด๋‹ค.

for(auto& elem : v){
    elem++;
}

๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์ด๋ผ๋ฉด, ์ด ๊ฒƒ์„ ์ผ์ผํžˆ ๋‹ค ์ณ์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ for_each() ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์‚ฌ์šฉ๋ฒ•

for_each(์‹œ์ž‘ ์ฃผ์†Œ๊ฐ’, ๋ ์ฃผ์†Œ๊ฐ’, ํ•จ์ˆ˜);

์ด๋•Œ ํŠน์ • ๊ฐ์ฒด์˜ ์‹œ์ž‘์ฃผ์†Œ๊ฐ’, ๋์ฃผ์†Œ๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์„ begin()ย end()ย ํ•จ์ˆ˜๋กœ ๋ฐฐ์› ๋‹ค.

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

๋”ฐ๋ผ์„œ ์œ„์— ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

for_each(begin(v), end(v), [](int& elem){elem++;});

์ถœ๋ ฅํ•ด๋ณด๋Š” ํ•จ์ˆ˜๋„ ๋น„์Šทํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

for_each(begin(v), end(v), [](int elem){cout << elem << "\t";});

transform()

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ์— ๋‚ด๊ฐ€ ์–ด๋–ค ์ž‘์—…์„ ํ•œ ๋’ค์—, ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ์–ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์— ์žˆ๋Š” ๊ฑด ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด reference ํ•ด์„œ ๊ฐ’์„ ๋ณ€ํ™”์‹œ์ผฐ๋‹ค๋ฉด, ๋ฐ”๊พผ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋Ÿด ๋•Œ,ย transform()ย ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์‚ฌ์šฉ๋ฒ•

transform(์†Œ์Šค_์‹œ์ž‘์ฃผ์†Œ, ์†Œ์Šค_๋์ฃผ์†Œ, ๋ชฉ์ ์ง€_์‹œ์ž‘์ฃผ์†Œ, ํ•จ์ˆ˜);

for_each()ย ์™€ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค!

vector<int> v2(v.size());
 
transform(begin(v), end(v), begin(v2), [](int elem){return elem*elem;});

copy()

ํŠน์ • ์ฃผ์†Œ์—์„œ ์ฃผ์†Œ๊นŒ์ง€ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

[์‹œ์ž‘ ์ฃผ์†Œ, ๋์ฃผ์†Œ)

๋ ์ฃผ์†Œ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์€ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

์‚ฌ์šฉ๋ฒ•

copy(์†Œ์Šค_์‹œ์ž‘์ฃผ์†Œ, ์†Œ์Šค_๋์ฃผ์†Œ, ๋ชฉ์ ์ง€ ์‹œ์ž‘์ฃผ์†Œ);
vector<int> v3(3);
copy(begin(v)+1, begin(v)+4, begin(v3));
for_each(begin(v3), end(v3), [](int elem)->int{cout << elem << "\t";});
2 3 4