copy(), ostream_iterator, istream_iterator
ํ๋์ ์ปจํ ์ด๋์์ ๋ค๋ฅธ ์ปจํ ์ด๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ copy()๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์ดํฐ๋ ์ดํฐ๋ค๋ก ํํ๋๋ค.
ex)
int casts[10] = {6,7,2,9,4,11,8,7,10,5};
vector<int> dice[10];
copy(casts,casts+10,dice.begin()); //๋ฐฐ์ด์ ๋ฐฑํฐ์ ๋ณต์ฌ
copy() ํจ์๋ ๋ชฉ์ ์ง ์ปจํ ์ด๋์ ์๋ ๊ธฐ์กด์ ๋ฐ์ดํฐ ์์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชฉ์ ์ง ์ปจํ ์ด๋๋ ๋ณต์ฌ๋๋ ํจ์๋ค์ ์ ์ฅํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ์ปค์ผ ํ๋ค.
STL์ ostream_iterator ํ ํ๋ฆฟ์ ํตํด ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ํ๋ด๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค.
iterator ํค๋ ํ์ผ์ ํฌํจ์ํค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํจ์ผ๋ก์จ, ์ด๋ฌํ ์ข ๋ฅ์ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
#include<iterator>
...
ostream_iterator<int,char> out_iter(cout," ");
์ด์ out_iter ์ดํฐ๋ ์ดํฐ๋ cout์ ์ฌ์ฉํ์ฌ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ์ ์๊ฒ ํด์ฃผ๋ ์ธํฐํ์ด์ค๊ฐ ๋๋ค.
์ฒซ ๋ฒ์งธ ํ ํ๋ฆฟ ๋งค๊ฐ๋ณ์(์ด ๊ฒฝ์ฐ์๋ int)๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ผ๋ก ๋ณด๋ด๋ ๋ฐ์ดํฐํ์ ๋ํ๋ธ๋ค. ๋ ๋ฒ์งธ ํ ํ๋ฆฟ ๋งค๊ฐ๋ณ์(์ด ๊ฒฝ์ฐ char)๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ด ์ฌ์ฉํ๋ ๋ฌธ์ํ์ ๋ํ๋ธ๋ค.(wchar_t๊ฐ ๋ ํ๋์ ๊ฐ๋ฅํ ๊ฐ) ์ฒซ ๋ฒ์งธ ์์ฑ์ ๋งค๊ฐ๋ณ์(cout)๋ ์ฌ์ฉํ ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ํ๋ธ๋ค. ๋ ๋ฒ์งธ ๋ฌธ์์ด ๋งค๊ฐ๋ณ์๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ณด๋ด์ง ๊ฐ ํญ๋ชฉ ๋ค์ ํ์๋๋ ๋ถ๋ฆฌ์์ด๋ค.
*out_iter++=15; //cout<<15<<" "; ์ฒ๋ผ ์๋ํ๋ค.
์ด ์ดํฐ๋ ์ดํฐ๋ฅผ copy()์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
copy(dice.begin(),dice.end(),out_iter); //๋ฒกํฐ๋ฅผ ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ณต์ฌ
๋๋ ์ต๋ช ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋ค ์๋ ์๋ค.
copy(dice.begin(),dice.end(),ostream_iterator<int,char>(cout," "));
๊ฐ์ ๋ ผ๋ฆฌ๋ก iteratorํค๋ ํ์ผ์ istream ์ ๋ ฅ์ ์ดํฐ๋ ์ดํฐ ์ธํฐํ์ด์ค์ ๋ง๊ฒ ๊ฐ๋ํ๊ธฐ ์ํ istream_iterator ํ ํ๋ฆฟ์ ์ ์ํ๋ค. ๋ ๊ฐ์ istream_iterator ๊ฐ์ฒด๋ฅผ ์ ์ํ์ฌ copy()์ ์ ๋ ฅ ๋ฒ์๋ฅผ ์ง์ ํด์ค ์ ์๋ค.
copy(istream_iterator<int,char>(cin), istream_iterator<int,char>(), dice.begin());
istream_iterator๋ ๋ ๊ฐ์ ํ ํ๋ฆฟ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค.
์ฒซ ๋ฒ์งธ ํ ํ๋ฆฟ ๋งค๊ฐ๋ณ์๋ ์ฝ์ ๋ฐ์ดํฐํ์ ๋ํ๋ธ๋ค. ๋ ๋ฒ์งธ ํ ํ๋ฆฟ ๋งค๊ฐ๋ณ์๋ ์ ๋ ฅ ์คํธ๋ฆผ์ ์ฌ์ฉ๋๋ char ๋ฐ์ดํฐํ์ ๋ํ๋ธ๋ค. ์์ฑ์ ๋งค๊ฐ๋ณ์๋ก cin์ ์ฌ์ฉํ๋ ๊ฒ์, cin์ด ๊ด๋ฆฌํ๋ ์ ๋ ฅ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ค๋ ๋ป์ด๋ค. ์์ฑ์ ๋งค๊ฐ๋ณ์๋ฅผ ์๋ตํ๋ ๊ฒ์, ์ ๋ ฅ ์คํจ๋ฅผ ๋ํ๋ธ๋ค. ๋ฐ๋ผ์ ์์ ์ฝ๋๋ ํ์ผ ๋, ๋ฐ์ดํฐํ ๋ถ์ผ์น ๋๋ ๋ค๋ฅธ ์ด๋ค ์ ๋ ฅ ์คํจ๊ฐ ์ผ์ด๋ ๋๊น์ง ์ ๋ ฅ ์คํธ๋ฆผ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค๋ ๋ป์ด๋ค.
-๊ธฐํ ์ ์ฉํ ์ดํฐ๋ ์ดํฐ๋ค
reverse_iterator๋ฅผ ์ฆ๊ฐ์ํค๋ฉด ๋ณธ์ง์ ์ผ๋ก๋ ๊ทธ๊ฒ์ ๊ฐ์์ํจ๋ค.
vector ํด๋์ค๋ past-the-end๋ฅผ ์ง์ํ๋ reverse_iterator๋ฅผ ๋ฆฌํดํ๋ rbegin()์ด๋ผ๋ ๋ฉค๋ฒ ํจ์์, ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ง์ํ๋ reverse_iterator๋ฅผ ๋ฆฌํดํ๋ rend() ๋ฉค๋ฒ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
copy(dice.rbegin(), dice.rend(),out_iter); //ํ์ง์ผ๋ก ์ถ๋ ฅ
reverse_iterator๋ ์ ์ธํ ํ์์กฐ์ฐจ ์๋ค.
rp๊ฐ dice.rbegin()์ผ๋ก ์ด๊ธฐํ๋๋ ์ญ๋ฐฉํฅ ํฌ์ธํฐ๋ผ๊ณ ๊ฐ์ ํ์. ์ญ๋ฐฉํฅ ํฌ์ธํฐ๋ค์ ๋จผ์ ๊ฐ์์ํจ ํ์ ๋ด์ฉ ์ฐธ์กฐ๋ฅผ ํ๋ค. ์ฆ, *rp๋ *rp์ ํ์ฌ ๊ฐ ๋ฐ๋ก ์์ ์๋ ์ดํฐ๋ ์ดํฐ ๊ฐ์ ๋ด์ฉ ์ฐธ์กฐํ๋ค.
์ฝ์ ์ ๊ธฐ์กด ๋ฐ์ดํฐ ์์ ์ฐ์ง ์๊ณ ์ ์์๋ค์ ์ถ๊ฐํ๋ฉฐ, ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ ์ฌ์ฉํ์ฌ ์ ์ ๋ณด์ ๊ผญ ๋ง๋ ๊ณต๊ฐ์ ํ๋ณดํ๋ค. back_insert_iterator๋ ์ปจํ ์ด๋์ ๋ง๋ฏธ์ ์์๋ค์ ์ฝ์ ํ๋ค. front_insert_iterator๋ ์ปจํ ์ด๋ ์ ๋์ ์์๋ค์ ์ฝ์ ํ๋ค. insert_iterator๋ insert_iterator ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ก ์ง์ ๋ ์์น ์์ ์์๋ค์ ์ฝ์ ํ๋ค. ์ด ์ธ ๊ฐ์ง๋ ๋ชจ๋ ์ถ๋ ฅ ์ปจํ ์ด๋ ๊ฐ๋ ์ ๋ชจ๋ธ๋ค์ด๋ค.
back_insert_iterator๋ ๋ง๋ฏธ์ ๋น ๋ฅธ ์ฝ์ ์ ํ์ฉํ๋ ์ปจํ ์ด๋ํ์๋ง ์ฌ์ฉํ ์ ์๋ค. ("๋น ๋ฅธ ์ฝ์ " ์ด๋ ๊ณ ์ ์๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฏธ) vector ํด๋์ค๋ ์ ํ์ ํ๋ค. front_insert_iterator๋ ์ ๋์ ๊ณ ์ ์๊ฐ ์ฝ์ ์ ํ์ฉํ๋ ์ปจํ ์ด๋ํ์๋ง ์ฌ์ฉํ ์ ์๋ค. ์ด๋ vector ํด๋์ค๋ ์ ํ์ ํ์ง ์์ง๋ง, queue ํด๋์ค๋ ์ ํ์ ํ๋ค. insert_iterator๋ ์ด๋ฌํ ์ ํ์ด ์๋ค. ๊ทธ๋ฌ๋ front_insert_iterator๋ ๊ทธ๊ฒ์ ์ง์ํ๋ ์ปจํ ์ด๋ํ๋ค์ ๋ํด ๋ ๋น ๋ฅด๋ค.
์ด ์ดํฐ๋ ์ดํฐ๋ค์ ์ปจํ ์ด๋ํ์ ํ ํ๋ฆฟ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๊ณ , ์ค์ ์ปจํ ์ด๋ ์๋ณ์๋ฅผ ์์ฑ์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ค. ์ฆ, dice๋ผ๋ vector<int> ์ปจํ ์ด๋ํ์ ๋ํด back_insert_iterator๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ค.
back_insert_iterator<vector<int>> back_iter(dice);
front_insert_iterator๋ ๊ฐ์ ํ์์ผ๋ก ์ ์ธํ๋ค.
insert_iterator์ ์ธ์ ์ฝ์ ๋ ์์น๋ฅผ ์ง์ ํ๋ ์์ฑ์ ๋งค๊ฐ๋ณ์๊ฐ ํ๋ ์ถ๊ฐ๋๋ค.
insert_iterator<vector<int>>insert_iter(dice,dice.begin());