ํ์ค ํ ํ๋ฆฟ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ์ค ํ ํ๋ฆฟ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(STL; Standard Template Library)๋ ์ปจํ ์ด๋, ์ดํฐ๋ ์ดํฐ, ํจ์ ๊ฐ์ฒด, ์๊ณ ๋ฆฌ์ฆ์ ๋ํ๋ด๋ ํ ํ๋ฆฟ๋ค์ ์งํฉ์ ์ ๊ณตํ๋ค.
์ปจํ ์ด๋๋, ๋ฐฐ์ด๊ณผ ๊ฐ์ด, ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ ์ฅํ ์ ์๋ ๊ตฌ์ฑ๋จ์์ด๋ค. STL ์ปจํ ์ด๋๋ ๊ฐ์ ์ข ๋ฅ์ ๊ฐ๋ค์ ์ ์ฅํ๋ค.
์๊ณ ๋ฆฌ์ฆ์, ๋ฐฐ์ด์ ์ ๋ฆฌํ๊ฑฐ๋ ๋ฆฌ์คํธ์์ ํน์ ๊ฐ์ ๊ฒ์ํ๋ ๊ฒ๊ณผ ๊ฐ์, ํน๋ณํ ์์ ๋ค์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ดํฐ๋ ์ดํฐ๋, ๋ฐฐ์ด ์์์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์น๋ฅผ ์ฎ๊ธฐ๋ฏ์ด, ์ปจํ ์ด๋ ์์์ ์์น๋ฅผ ์ฎ๊ธธ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฐ์ฒด๋ค์ด๋ค.
ํจ์ ๊ฐ์ฒด๋ ํจ์์ ๋น์ทํ ์ญํ ์ ํ๋ ๊ฐ์ฒด์ด๋ค. ํจ์ ๊ฐ์ฒด๋ ํด๋์ค ๊ฐ์ฒด์ผ ์๋ ์๊ณ , ํจ์ ํฌ์ธํฐ์ผ ์๋ ์๋ค.
STL์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด, ํ, ๋ฆฌ์คํธ์ ๊ฐ์ ๋ค์ํ ์ปจํ ์ด๋๋ค์ ์์ฑํ ์ ์๋ค. ๋ํ STL์ ๊ฒ์, ์ ๋ ฌ, ๋ฌด์์ํ ๋ฑ ๋ค์ํ ์์ ์ ์ํ ๊ฐ๋ฅํ๊ฒ ํด ์ค๋ค.
vector ํ ํ๋ฆฟ ํด๋์ค
์ ์ฐ ๋ถ์ผ์์ ์ฌ์ฉํ๋ ๋ฒกํฐ๋ผ๋ ์ฉ์ด๋ ์ํ์ ์ธ ๋ฒกํฐ๊ฐ ์๋๋ผ ๋ฐฐ์ด์ ์๋นํ๋ ๊ฒ์ด๋ค.
vector ํ ํ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๋ฉด, ์ฌ์ฉํ ๋ฐ์ดํฐํ์ ๋ํ๋ด๊ธฐ ์ํด ํต์์ ์ธ <type> ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ค. ๋ํ vector ํ ํ๋ฆฟ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ ์ฌ์ฉํ๋ค.
vector<int> ratings(5); //5๊ฐ์ intํ ๊ฐ์ ๊ฐ์ง ๋ฒกํฐ
vector ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๋, []์ ๋ํ ์ฐ์ฐ์ ์ค๋ฒ ๋ก๋ฉ์ผ๋ก ๊ฐ๋ณ์ ์ธ ์์๋ค์ ์ ๊ทผํ ์ ์๋ ๋ฐฐ์ด ํ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
vector์์ ํ ์ ์๋ ๊ฒ
๋ชจ๋ STL ์ปจํ ์ด๋๋ค์ ์ปจํ ์ด๋์ ์๋ ์์๋ค์ ๊ฐ์๋ฅผ ๋ฆฌํดํ๋ size(), ๋ ์ปจํ ์ด๋์ ๋ด์ฉ์ ๊ตํํ๋ swap(), ์ปจํ ์ด๋์ ์๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ฐธ์กฐํ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฆฌํดํ๋ begin(), ์ปจํ ์ด๋์ ์๋ ๋ง์ง๋ง ์์ ๋ค์์ ์ฐธ์กฐํ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฆฌํดํ๋ end()๋ฑ์ ๊ธฐ๋ณธ์ ์ธ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ค.
์ดํฐ๋ ์ดํฐ(iterator)๋ ํฌ์ธํฐ์ ์ผ๋ฐํ์ด๋ค.
์ดํฐ๋ ์ดํฐ๋ ํฌ์ธํฐ ๋๋ ๋ด์ฉ ์ฐธ์กฐ(operator *())์ ์ฆ๊ฐ(operator++())์ ๊ฐ์, ํฌ์ธํฐ๋ฅผ ๋ฎ์ ์ฐ์ฐ๋ค์ด ์ ์๋์ด์๋ ๊ฐ์ฒด์ผ ์๋ ์๋ค. ๊ฐ ์ปจํ ์ด๋ ํด๋์ค๋ ํ๋์ ์ ์ ํ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ ์ํ๋ค. ๊ทธ ์ดํฐ๋ ์ดํฐ์ ๋ฐ์ดํฐํ ์ด๋ฆ์ iterator์ธ๋ฐ, ํด๋์ค ์ฌ์ฉ ๋ฒ์๋ฅผ ๊ฐ์ง๋ typedef์ด๋ค. ์๋ฅผ ๋ค์ด, vector์ doubleํ ํน์ํ๋ฅผ ์ํ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ ์ธํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
vector<double>::iterator pd; //pd๋ ์ดํฐ๋ ์ดํฐ
scores๊ฐ vector<double> ๊ฐ์ฒด๋ผ๊ณ ๊ฐ์ ํ์.
vector<double> scores;
๊ทธ๋ฌ๋ฉด ์ด์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ์ดํฐ๋ ์ดํฐ pd๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
pd = scores.begin(); //pd๊ฐ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ง์ํ๊ฒ ๋ง๋ ๋ค.
*pd=22.3; //pd๋ฅผ ๋ด์ฉ ์ฐธ์กฐํ์ฌ ์ฒซ ๋ฒ์งธ ์์์ ๊ฐ์ ๋์ ํ๋ค.
++pd; //pd๊ฐ ๊ทธ๋ค์ ์์๋ฅผ ์ง์ํ๊ฒ ๋ง๋ ๋ค.
๊ทธ ๋ฐ์๋ c++11์ ์๋ ํ์ ์ถ๋ก ์ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๋ ์๋ค.
vector<double>::iterator pd=scores.begin();
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅ
auto pd = scores.begin();
๋ํ vector ํ ํ๋ฆฟ ํด๋์ค๋ ์ผ๋ถ STL ์ปจํ ์ด๋๋ค๋ง์ด ๊ฐ์ง๊ณ ์๋ ๋ช ๊ฐ์ง ๋ฉ์๋๋ค์ ๊ฐ์ง๊ณ ์๋ค. push_back()์ด๋ผ๋ ๊ฐ๋จํ ๋ฉ์๋๋, ๋ฒกํฐ์ ๋์ ํ๋์ ์์๋ฅผ ์ถ๊ฐํ๋ค.
์ง์ ๋ ๋ฒ์๋ฅผ ๋ฒกํฐ์์ ์ญ์ ํ๋ erase()๋ผ๋ ๋ฉ์๋๊ฐ ์๋ค.
์ด ๋ฉ์๋๋ ์ญ์ ํ ๋ฒ์๋ฅผ ์ ์ํ๋ 2๊ฐ์ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ค. ์ฒซ ๋ฒ์งธ ์ดํฐ๋ ์ดํฐ๋ ๋ฒ์์ ์์์ ์ฐธ์กฐํ๊ณ , ๋ ๋ฒ์งธ ์ดํฐ๋ ์ดํฐ๋ ๋ฒ์์ ๋ ๋ฐ๋ก ๋ค์์ ์ฐธ์กฐํ๋ค.
scores.erase(scores.begin(),scores.begin()+2);
begin()๊ณผ begin()+1์ ์ํด ์ฐธ์กฐ๋๋, ์ฒซ ๋ฒ์งธ ์์์ ๋ ๋ฒ์งธ ์์๋ฅผ ์ญ์ ํ๋ค.
insert() ๋ฉ์๋๋ erase() ๋ฉ์๋์ ๋ฐ๋ ๊ธฐ๋ฅ์ ํ๋ค.
์ด ๋ฉ์๋๋ 3๊ฐ์ ์ดํฐ๋ ์ดํฐ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค.
์ฒซ ๋ฒ์งธ ์ดํฐ๋ ์ดํฐ ๋งค๊ฐ๋ณ์๋ ์๋ก์ด ์์๋ค์ด ์ฝ์ ๋ ์์น ๋ฐ๋ก ์์ ์์น๋ฅผ ์ ๊ณตํ๋ค. ๋ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ์ดํฐ๋ ์ดํฐ ๋งค๊ฐ๋ณ์๋ ์ฝ์ ์ ์ฌ์ฉ๋ ๋ฒ์๋ฅผ ์ ์ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด ๋ฒ์๋ ๋ ๋ค๋ฅธ ์ปจํ ์ด๋ ๊ฐ์ฒด์ ์ผ๋ถ์ด๋ค.
vector<int> old;
vector<int> new;
...
old.insert(old.begin(),new.begin()+1,new.end());
new๋ฒกํฐ์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ ์ธํ ๋ชจ๋ ์์๋ฅผ old ๋ฒกํฐ์ ์ฒซ ๋ฒ์งธ ์์ ์์ ์ฝ์ ํ๋ค.
vector์์ ํ ์ ์๋ ๊ทธ ๋ฐ์ ๊ฒ
๋ํ์ ์ธ STL ํจ์์ธ for_each(), random_shuffle(), sort() ์ธ ๊ฐ์ง๋ฅผ ์ดํด๋ณด์.
for_each() ํจ์๋ ๋ชจ๋ ์ปจํ ์ด๋ ํด๋์ค์ ์ฌ์ฉํ ์ ์๋ค.
3๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค. ์ฒซ ๋ฒ์งธ์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์ปจํ ์ด๋์ ๋ฒ์๋ฅผ ์ ์ํ๋ ์ดํฐ๋ ์ดํฐ์ด๋ค. ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ํจ์๋ฅผ ์ง์ํ๋ ํฌ์ธํฐ์ด๋ค. for_each() ํจ์๋ ์ง์๋ ํจ์๋ฅผ ๊ทธ ๋ฒ์ ์์ ์๋ ๊ฐ ์ปจํ ์ด๋ ์์์ ์ ์ฉํ๋ค. ์ง์๋ ํจ์๋ ์ปจํ ์ด๋ ์์๋ค์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์ ๋๋ค.
vector<Review>::iterator pr;
for(pr=books.begin();pr!=books.end();pr++)
ShowReview(*pr);
๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ ์ ์๋ค.
for_each(books.begin(),books.end(),ShowReview);
random_shuffle() ํจ์๋ ๋ฒ์๋ฅผ ์ง์ ํ๋ ๋ ๊ฐ์ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ, ๊ทธ ๋ฒ์ ์์ ์๋ ์์๋ค์ ๋ฌด์์ ์์๋ก ์ฌ๋ฐฐ์นํ๋ค.
random_shuffle(books.begin(),books.end());
์ด ๊ตฌ๋ฌธ์, books ๋ฒกํฐ์ ์๋ ๋ชจ๋ ์์๋ค์ ์์๋ฅผ ๋ฌด์์ ์์๋ก ์ฌ๋ฐฐ์นํ๋ค.
sort() ํจ์๋ ๋ ๊ฐ์ง ๋ฒ์ ์ด ์๋ค. ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ ๋ฒ์๋ฅผ ์ง์ ํ๋ ๋ ๊ฐ์ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ปจํ ์ด๋์ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐํ์ ์์์ ๋ง๊ฒ ์ ์๋ < ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ ๋ฒ์๋ฅผ ์ ๋ ฌํ๋ค.
vector<int> coolstuff;
...
sort(coolstuff.begin(),coolstuff.end());
๋ด์ฅ๋ < ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ค์ ๋น๊ตํจ์ผ๋ก์จ, coolstuff์ ๋ด์ฉ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
์ปจํ ์ด๋ ์์๋ค์ด ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด์ผ ๋, sort() ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ทธ ๊ฐ์ฒด์ ๋ฐ์ดํฐํ์ ๋ง๊ฒ ์ ์๋ operator<() ํจ์๊ฐ ์์ด์ผ ํ๋ค.
๋ด๋ฆผ์ฐจ์์ผ๋ก ๋๋ ์ฑ ์ ๋ชฉ ๋์ ์ฑ ๋ฑ๊ธ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ค ํ๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ฌํ ๊ฒฝ์ฐ, ๋ ๋ฒ์งธ ๋ฒ์ ์ sort()๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ ๋ฒ์งธ ๋ฒ์ ์ 3๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ๋ฒ์๋ฅผ ์ง์ ํ๋ ์ดํฐ๋ ์ดํฐ์ด๋ค. ์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ๊ฐ์ ๋น๊ตํ๊ธฐ ์ํด operator<() ๋์ ์ ์ฌ์ฉํ ํจ์๋ฅผ ์ง์ํ๋ ํฌ์ธํฐ์ด๋ค. ๋ฆฌํดํ์ boolํ์ผ๋ก ๋ณํํ ์ ์์ด์ผ ํ๋ค.
Range์ ๊ธฐ์ดํ ๋ฃจํ(c++11)
for_each(books.begin(),books.end(),ShowReview);
์ด๋ ๋ค์๊ณผ ๊ฐ์ด range์ ๊ธฐ์ดํ ๋ฃจํ๋ก ๋์ฒด ๊ฐ๋ฅ
for(auto x:books) ShowReview(x);
for_each()์๋ ๋ฌ๋ฆฌ range์ ๊ธฐ์ดํ for๋ ์ ์ฅ์์ ๋ด์ฉ์ ์์ ํ ์ ์๋ค. ์ด๋ฅผ ์ํด์๋ ์ฐธ์กฐ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.