4. STL
by JiwonDevSTL์ Standard Template Library ์ผ๋ก์ CPP์์ ์ ๊ณตํ๋ ์ปจํ ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์๊ฐ๋ณด๋ค ๊ธฐ๋ฅ์ด ๋ง์ผ๋ฏ๋ก, ๊ฐ๋จํ๊ฒ ์์๋ณด๊ณ ํ์ํ ๋ ์์ธํ๊ฒ ์ฐพ์๋ณด์.
0. ๋ฐ๋ณต์, iterator
์ปจํ ์ด๋๋ค์ ์์๋๋ก ์ ๊ทผํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. ์ผ์ข ์ ํฌ์ธํฐ.
์ฐธ๊ณ ๋ก ๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅํ๋ฐ, ๋ง๊ณ ์ถ์ผ๋ฉด const_iterator์ ์ฌ์ฉํ๋ฉด ๋๋ค.
list<int> ls = {10, 20, 30};
list<int>::iterator iter; // ์ด๋ ๊ฒ ์ง์ iter ๊ฐ์ฒด๋ฅผ ์์ฑํด๋ ๋๋ค.
ls.begin(); ls.end(); // ๋๋ ์ด๋ ๊ฒ ํด๋น ๊ฐ์ฒด์์ iter ํฌ์ธํฐ๋ฅผ ์ป์ด์๋ ๋จ.
/*
์ฐธ๊ณ ๋ก begin์ 0๋ฒ ์ธ๋ฑ์ค, end()๋ ๋ง์ง๋ง null ๊ฐ์ ๊ฐ๋ฅดํค๊ณ ์๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
begin ์ด์ end ๋ฏธ๋ง. ๋ง์ง๋ง๊ฐ์ ํฌํจํ์ง ์๋๋ค.
*/
list<int>::const_iterator citer; // ๊ฐ ๋ณ๊ฒฝ์ ์ํ์ง ์๋๋ค๋ฉด const_iterator ์ฌ์ฉ
iter = ls.begin();
citer = ls.end();
*iter = 100; // ์ด๋ ๊ฒ ํฌ์ธํฐ๋ก ๊ฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
// *citer = 300; cosnt๋ ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ.
1. Container
์ปจํ ์ด๋๋ ๊ฐ์ ํ์ ์ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ณณ, ์ฝ๊ฒ ๋งํด ์๋ฃํ์ ์ฐ๊ธฐ ํธํ๊ฒ ํ์ฅํด์ค๊ฑฐ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
STL์์ ์ปจํ ์ด๋๋ ํฌ๊ฒ 3์ข ๋ฅ๋ก ๋๋๋๋ฐ, ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ข ๋ฅ | ์ค๋ช | ์์ |
์ํธ์ค(iterable) | ๋ฐ์ดํฐ๋ฅผ ์์๋๋ก ์ ์ฅ | vector, deque, list, forward_list |
์ฐ๊ด(set, map) | ๋ฐ์ดํฐ๋ฅผ ์ผ์ ๊ท์น์ ๋ฐ๋ผ ์ ์ฅ | set, map, multiset, multimap |
์ปจํ ์ด๋ ์ด๋ํฐ | ๊ธฐ๋ฅ์ ์ ํํ์ฌ ์ํ๋ ๊ตฌ์กฐ๋ก ์ฌ์ฉ | stack, queue, priority_queue |
2. ์ํธ์ค ์ปจํ ์ด๋(sequence)
2-1 vector
๋ง์จ๋ ๋๋ ๋ง๋ฅ ์๋ฃํ. ํฌ๊ธฐ๊ฐ ์๋์ผ๋ก ๋์ด๋๋ ๋์ ๋ฐฐ์ด. stack๊ณผ ๋น์ทํ๊ฒ ์ ๋ ฅ ๊ฐ์ ๋ค์ ์ถ๊ฐํ๊ธฐ ์ข๋ค.
์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํด์ ์ธ๋ฑ์ค์ ๊ทผ์ด ๋น ๋ฅด์ง๋ง ์ค๊ฐ์ฝ์ / ์ด๋ฏธ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์ฅํ ๋ ค๋ฉด ์ ์ฅ๋ ๊ฐ ์ ์ฒด๋ฅผ ๋ค๋ฅธ ๊ณต๊ฐ์ผ๋ก ์ฎ๊ฒจ์ผํด์ผ ํด์ ์๊ฐ์ด ๋ง์ด๊ฑธ๋ฆฐ๋ค.
vector<์๋ฃํ> ๊ฐ์ฒด์ด๋ฆ();
vector<int> v // ๋น ์ปจํ
์ด๋
vector<int> v = { 10, 20, 30, 40 } // cpp ๋ฉค๋ฒ ์ด๊ธฐํ ํ์์ผ๋ก ์์ฑ๋ ๊ฐ๋ฅ.
//์ฐธ๊ณ ๋ก v.assign(์ธ์) ์ผ๋ก ํ๋ฉด ์์ฑ์์ ๋๊ฐ์ ๊ธฐ๋ฅ์.
vector<int> v(n) // ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ๋ n๊ฐ
vector<int> v(n,x) // ๊ฐ x๋ก ์ด๊ธฐํ
vector<int> v(๋ค๋ฅธ ๋ฒกํฐ) // ๋ฒกํฐ ๋ณต์ฌ(๊ฐ ๋ณต์ฌ)
vector<int> v(v.begin() v.end()) // ์ด๋ฐ ์์ผ๋ก ์ด๊ธฐํ/์์ฑ๋ ๊ฐ๋ฅ
v.swap(v2) // ๋ฒกํฐ์ ๊ฐ ์๋ก ๋ฐ๊พธ๊ธฐ
v.size() // ํ ๋น๋ ์์์ ๊ฐฏ์
v.capacity() // ํ์ฌ ์์ฝ๋(์ฌ์ฉ์ค์ธ) ๋ฉ๋ชจ๋ฆฌ์ ๊ฐฏ์
v.resize(n, x) // ํด๋น ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ n์ผ๋ก ๋ณ๊ฒฝํจ. x๋ ์ด๊ธฐํ๊ฐ. ์๋ต๊ฐ๋ฅ
v.at(i); // v[i]์ ๊ฐ์. i๋ฒ์งธ ์์ ๊ฐ. ์ฐธ๊ณ ๋ก .at()์ ์ฌ์ฉํด์ผ ์์ธ์ฒ๋ฆฌ๊ฐ ์๋ํ๋ค.
v.back() // ๋ง์ง๋ง ์์ ๊ฐ
v.front() // ์ฒซ๋ฒ์จฐ ์์ ๊ฐ
p = v.begin() // ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฅดํค๋ iter
p = v.end() // ๋ง์ง๋ง ์์๋ฅผ ๊ฐ๋ฅดํค๋ iter. ์ฐธ๊ณ ๋ก [b,e)์.
p = v.rbegin() // begin๊ณผ ๊ฐ์ง๋ง ๊ฑฐ๊พธ๋ก ๋ฐ๋ณตํจ. ๋ฆฌ๋ฒ์ค
p = v.rend() // ๋ง์ฐฌ๊ฐ์ง
q = v.erase(p) // p๊ฐ ๊ฐ๋ฅดํค๋ ์์๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ๊ฐ ํฌ์ธํฐ๋ฅผ ๋ฐํํจ.
q = v.erase(begin, end) // ํฌ์ธํฐ๋ก ์ญ์ ํ๋ ๋ฐฉ๋ฒ. ์ด ์ญ์ [b,e)์.
q = v.insert(p,x) // ํฌ์ธํฐ p์ ๊ฐ x ์ฝ์
. ์ฝ์
ํ ์์น ํฌ์ธํฐ(๊ฐ:x) ๋ฐํ.
v.insert(p,n,x) // ํฌ์ธํฐ p์ x๋ฅผ n๊ฐ ์ฝ์
.
v.pop_back() // pop. ๋ง์ง๋ง ์์ ์ ๊ฑฐ
v.push_back() // push. ๋ง์ง๋ง ์์์ ์ถ๊ฐ
v.clear() // ๋ชจ๋ ์์ ์ ๊ฑฐ
v.empty() // ๋น์๋์ง ํ์ธ, capacity์๋ ์๊ด์์.
๋น๊ต ์ฐ์ฐ์ | |
v1 == v2 | v1๊ณผ v2์ ๋ชจ๋ ์์๊ฐ ๊ฐ์๊ฐ? (bool) |
v1 != v2 | v1๊ณผ v2์ ๋ชจ๋ ์์ ์ค ํ๋๋ผ๋ ๋ค๋ฅธ ์์๊ฐ ์๋๊ฐ? |
v1 < v2 | ๋ฌธ์์ด ๋น๊ต์ฒ๋ผ v2๊ฐ v1๋ณด๋ค ํฐ๊ฐ? |
v1 > v2 | ๋ฌธ์์ด ๋น๊ต์ฒ๋ผ v1์ด v2๋ณด๋ค ํฐ๊ฐ? |
v [i] | v์ i๋ฒ์งธ ์์ ์ฐธ์กฐ(๊ฐ์ป๊ธฐ or ๊ฐ ๋ณ๊ฒฝํ๊ธฐ) |
2-2 deque (double-ended queue)
์ ๋ ฅ๊ฐ์ ์, ๋ค๋ก ์ถ๊ฐ ์ฝ์ ์ด ๋ง์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
๋ฒกํฐ์ ๋น์ทํ์ง๋ง ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๋ฒกํฐ์ฒ๋ผ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ ์ฐ์ง์๊ณ , ์ผ์ ๋จ์(chunk)๋ณ๋ก ์ ์ฅ์ ํด์ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋์ด ๋ง์ ๊ฒฝ์ฐ ํ์ฅ์ ์ ๋ฆฌํ๋ค. ๋ค๋ง ๋ฒกํฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์,๋ค๊ฐ ์๋ ์ค๊ฐ์ฝ์ ์ํ์ ์๋๊ฐ ๋งค์ฐ ๋๋ฆฌ๋ค.
// vector์ ๋น์ทํ๋ฐ, ์๋์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ค๋ค.
deque<int> dq = {20, 30};
dq.push_back(30);
dq.push_front(30);
dq.pop_back();
dq.pop_front();
2-3 List
์ธ๋ฑ์ค์ ๊ทผ(์์ ์ ๊ทผ)์ด ํ์์๊ณ ์ฝ์ ์ญ์ ๊ฐ ๋ง์ ๋ ์ ์ฉํ ์๋ฃํ์ด๋ค. ๋ด๋ถ๋ ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํ๋์ด์๋ค.
๊ฐ ์ ๊ทผ ์๋๊ฐ deque, vector๋ณด๋ค ๋๋ฆฌ์ง๋ง ์๋์ ๊ฐ์ด ์ค๊ฐ ์ฝ์ /์ญ์ ๊ฐ ๋ง์ ์์ ์ ๋ง์ด ํ ๋์๋ ๋ฆฌ์คํธ๊ฐ ํจ์ฌ ์ต์ ํ๊ฐ ์๋์ด์์ด ๋น ๋ฅด๋ค.
ํจ์ | ์ค๋ช |
swap() | ๋ ์์์ ์์น๋ฅผ ๋ฐ๊ฟ |
reverse() | ๋ฆฌ์คํธ ์ ์ฒด๋ฅผ ์ญ์์ผ๋ก ๋ฐ๊ฟ |
sort() | ๋ฆฌ์คํธ ์ ์ฒด๋ฅผ ์ ๋ ฌํจ. |
unique() | ๊ฐ์ ๊ฐ์ด ๋ถ์ด์๋๊ฒฝ์ฐ, ํ๋๋ก ๋ง๋ฌ ( 1, 3, 3, 3, 1 ->1, 3, 1) |
merge() | ๋ ๋ฆฌ์คํธ๋ฅผ ํฉ๋ณ ์ ๋ ฌํจ. |
splice(ํฌ์ธํฐ, ๋ฆฌ์คํธ) | ๋ ๋ฆฌ์คํธ๋ฅผ ์ฐ๊ฒฐํ๊ฑฐ๋ ํ์ชฝ์ ๋ถ์. |
.remove(๊ฐ) | ํด๋น ๊ฐ์ ๋ชจ๋ ์ ๊ฑฐํ๋ค. |
.remove_if(ํจ์) | ํด๋น ์กฐ๊ฑด์ด ์ฐธ(true)์ธ ๋ชจ๋ ์์๋ฅผ ์ ๊ฑฐํ๋ค. |
2-4 forward_list
์๋ฐฉํฅ ๋ฆฌ์คํธ. ๋ฆฌ์คํธ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต์ ํํ ๋ฒ์ ์ผ๋ก ๋ฌด์กฐ๊ฑด ์๋ฐฉํฅ์ผ๋ก๋ง ์ ๊ทผํ ์ ์๋ค.
๊ธฐ๋ฅ์ ๋ฆฌ์คํธ์ ํฐ ์ฐจ์ด ์๋ค.
3. ์ฐ๊ด ์ปจํ ์ด๋ (associate)
map์ด๋ set๊ฐ์ ์๋ฃํ๋ค. ์ ์ฐธ๊ณ ๋ก ์์ multi๊ฐ ๋ถ์ ๊ฑด ํค์ ์ค๋ณต์ ํ์ฉํ๋ค๋ ์๋ฏธ๋ค.
3-1 pair
๋ ๊ฐ์ฒด๋ฅผ ํ๋์ ์์ผ๋ก ํํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
๋ณดํต map ๊ฐ์ ๊ณณ์ ์ธ๋ ค๊ณ key-set์ด ํ ์์ธ ์๋ฃํ์ ์ํด ๋ง๋ค์ด์ง ์ปจํ ์ด๋.
์ฐธ๊ณ ๋ก ๋น๊ต ์ฐ์ฐ์๋ sort๊ฐ ๊ฐ๋ฅํ๋ค. (์ฒซ๋ฒ์งธ ์ธ์ ๊ธฐ์ค, ๊ฐ์ผ๋ฉด ๋๋ฒ์จฐ ์ธ์๊น์ง ๋น๊ต)
pair<ํด๋์ค1,ํด๋์ค2> p;
p.first // ํด๋์ค 1 ๋ฐํ
p.second // ํด๋์ค 2 ๋ฐํ
make_pair(x1, x2)// ๊ฐ x1, x2๋ฅผ pair๋ก ๋ง๋ค์ด์ ๋ฐํ
3-2 set
set<๊ฐ์ฒด> ๊ฐ์ฒด์ด๋ฆ;
set<int> st;
st.insert(10); // ํด๋น ๊ฐ ์ถ๊ฐ
st.erase(10); // ํด๋น ๊ฐ ์ญ์ (์ ๋ถ)
3-3 map
map<key, value> ๊ฐ์ฒด์ด๋ฆ;
map<string, int> mp;
mp.insert(pair<string,int>("ํค๊ฐ", 80));
mp["ํค๊ฐ"] = 80;
4. ์ปจํ ์ด๋ ์ด๋ํฐ
Stack, Queue, Priority_queue
stack์ด๋ queue ๊ฐ์ ์๋ฃํ์ ์ง๊ด์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ ์ปจํ ์ด๋.
ํด๋น ์๋ฃ๊ตฌ์กฐ์ ๋น์ ์์ ์ธ ์ ๊ทผ์ ์ฐจ๋จํด์ฃผ๊ณ ๋ฉ์๋ ์ด๋ฆ์ ๊น๋ํ๊ฒ ์ ๋ฆฌํ๋ค.
๋ค๋ง ๋ด๋ถ๊ตฌ์กฐ๋ ๊ธฐ๋ณธ ์ปจํ ์ด๋๋ค(vector)๊ณผ ๋์ผํ๋ค. ๊ทธ๋์ ์ด๋ํฐ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ฉ์๋ | ์ค๋ช |
.empty() | ์คํ์ด ๋น์ด ์์ผ๋ฉด true๋ฅผ, ๋น์ด ์์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํจ. |
.size() | ์คํ ์์์ ์ด ๊ฐ์๋ฅผ ๋ฐํํจ. |
.top() | ์คํ์ ์ ์ผ ์๋จ์ ์๋ (๋ง์ง๋ง ๊ฐ)์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐํํจ. |
.push() | ์คํ์ ์ ์ผ ์๋จ์ ์์๋ฅผ ์ฝ์ ํจ. |
.pop() | ์คํ์ ์ ์ผ ์๋จ์ ์๋ ์์๋ฅผ ์ญ์ ํจ. |
.front() | (ํ๋ง ํด๋น) ์ ์ผ ์์ ์์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐํํจ. |
.back() | (ํ๋ง ํด๋น) ์ ์ผ ๋ค์ ์์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐํํจ. |
์ฐธ๊ณ ๋ก ์ฐ์ ์์ ํ (priority_queue)๋ ๊ฐ์ฅ ํฐ ๊ฐ์ด ๋งจ ์์ผ๋ก ์ค๊ฒ๋๋ ํ์ด๋ค. (์๋์ ๋ ฌ)
'๐ฑBackend > CPP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
3. ์์ธ์ฒ๋ฆฌ (0) | 2020.12.29 |
---|---|
3. Class (0) | 2020.12.28 |
2. Cpp์ ๋ ํนํ ์ฌ์ฉ๋ฒ (0) | 2020.12.26 |
1. Hello World (0) | 2020.12.26 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev