๐ก vector์ ์ฃผ์ ์ธํฐํ์ด์ค์ ํน์ง
vector ์ปจํ ์ด๋๋ ๋ํ์ ์ธ ์ํ์ค ์ปจํ ์ด๋๋ก ๋ฐฐ์ด๊ณผ ๋น์ทํ ์์์ ๋๊ณ ์์ต๋๋ค.
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ ๋์ ๋ง์ด ์ฌ์ฉ๋๋ ์ปจํ ์ด๋ ์ค ํ๋ ์ ๋๋ค.
๋ํ vector๋ ์ํ์ค ์ปจํ ์ด๋์ด๊ธฐ ๋๋ฌธ์ ์์์ ์ ์ฅ ์์น(์์)๊ฐ ์ ํด์ง๋ฉฐ, ๋ฐฐ์ด ๊ธฐ๋ฐ ์ปจํ ์ด๋์ด๋ฏ๋ก ์์๊ฐ ํ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋น๋ฉ๋๋ค.
์ํ์ค ์ปจํ ์ด๋๋
์์๋ฅผ ์ฐจ๋ก์ฐจ๋ก ์ถ๊ฐํ๋ push_back()๊ณผ ์ ๊ฑฐํ๋ pop_back() ์ฐ์ฐ๊ณผ
์ฒซ ์์๋ฅผ ์ฐธ์กฐํ๋ front()์ ๋ง์ง๋ง ์์๋ฅผ ์ฐธ์กฐํ๋ back() ์ฐ์ฐ
์ง์ ํ ์์น์ ์์๋ฅผ ์ฝ์ ํ ์ ์๋ insert() ์ฐ์ฐ์ ๊ฐ์ง๋๋ค.
vector์ ๊ฒฝ์ฐ ์์ชฝ์ด ๋งํ์๋ ํํ์ด๊ธฐ ๋๋ฌธ์ ์ ์ชฝ์์ ์์๋ฅผ ์ถ๊ฐ/์ ๊ฑฐ๋ฅผ ํ ์ ์์ผ๋ฉฐ, ๋ท ์ชฝ์์๋ง ์์๋ฅผ ์ถ๊ฐ/์ ๊ฑฐ(push_back(), pop_back()) ํ ์ ์์ต๋๋ค.
๐ก vector์ ์์ฑ์
vector<T> v | v๋ ๋น ์ปจํ ์ด๋ |
vector<T> v(n) | v์ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋ n๊ฐ์ ์์๊ฐ ์๋ค. |
vector<T> v(n,x) | v์ x๊ฐ์ผ๋ก ์ด๊ธฐํ ๋ n๊ฐ์ ์์๊ฐ ์๋ค. |
vector<T> v(v2) | v๋ vector<T> v2์ ๋ณต์ฌ๋ณธ์ด๋ค. |
vector<T> v(b,e) | v๋ ๋ฐ๋ณต์ ๊ตฌ๊ฐ [b,e)๋ก ์ด๊ธฐํ๋ ์์๋ฅผ ๊ฐ์ง๋ค. |
๐ก ํ ๋น(ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ)
1. ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ ๋ฉค๋ฒ ํจ์ - size(), capacity(), max_size()
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << v.max_size();
[์ถ๋ ฅ ๊ฒฐ๊ณผ]
5 // size(): ์์์ ๊ฐ์
6 // capacity(): ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ
1073741823 // max_size(): ์ต๋ ์ ์ฅ ๊ฐ๋ฅํ ์์์ ๊ฐ์
size()์ max_size()๋ ์ง๊ด์ ์ผ๋ก ์ดํด๊ฐ ๊ฐ๋ฅํ์ง๋ง, capacity()๋ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค.
ํด๋น ๋ฉค๋ฒ ํจ์๋ฅผ ์ดํดํ๋ ค๋ฉด vector์ ๋ํด ์ข ๋ ์์๋ณผ ํ์๊ฐ ์์ต๋๋ค.
2. capacity()์ ๋ํ์ฌ
์์์ ์ฌ์ฉํด๋ดค๋ size()์ max_size()๋ ๋ชจ๋ ์ปจํ ์ด๋๊ฐ ๊ฐ์ง๋ ๋ฉค๋ฒ ํจ์์ ๋๋ค.
ํ์ง๋ง capacity()๋ ์ค์ง vector ์ปจํ ์ด๋๋ง์ด ๊ฐ์ง๊ณ ์๋ ๋ฉค๋ฒ ํจ์์ ๋๋ค.
์์ผ๊น์?
์ด๋ vector์ "๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ ์ฑ "๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
vector๋ push_back()์ ํตํด์ ์์๋ฅผ ๊ณ์ํด์ ์ถ๊ฐ ํ ์ ์๋ ์ปจํ ์ด๋ ์ ๋๋ค.
(์ฆ, ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๊ฐ ๊ณ์ํด์ ๋ณํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.)
์์๊ฐ ์ถ๊ฐ ๋ ๋๋ง๋ค ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ๋๋ ค์ค์ผ ํ๋ค๋ ์ด์ผ๊ธฐ์ ๋๋ค.
์์๊ฐ ์ถ๊ฐ ๋ ๋, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋งค๋ฒ ์ฌ ํ ๋นํ๊ณ ๊ธฐ์กด์ ๊ฐ๋ค์ ์ฌ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ๋ณต์ฌํ๋ค๋ฉด ๋๋ฌด ๋นํจ์จ์ ์ผ ๊ฒ์ ๋๋ค.
์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ฐ๋ ์ด ๋ฐ๋ก capacity์ ๋๋ค.
์์๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌํ ๋นํ์ง ์๊ณ ๋ฏธ๋ฆฌ ๋๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๋ค๋ฉด, ๋น์ฉ์ ์ค์ผ ์ ์์ต๋๋ค.
์์๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ ๋,
โ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ(capacity) ≥ ์์์ ๊ฐ์(size)์ผ ๋, ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น ์ํ X
โ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ(capacity) ๏ผ ์์์ ๊ฐ์(size)์ผ ๋, ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น ์ํ O
๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ ์ฑ ์ ์ปดํ์ผ๋ฌ๋ง๋ค ์กฐ๊ธ์ฉ ๋ค๋ฅด์ง๋ง ๋์ฒด๋ก ์ด์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ 1/2๋งํผ์ ๋ ํ ๋นํฉ๋๋ค.
3. reserve(), resize(), swap()
1) ๋ฉ๋ชจ๋ฆฌ ์์ฝ ํจ์ reserve()
์ํ๋ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ฉด reserve()๋ฅผ ํตํด capacity๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค.
size๊ฐ capacity๋ฅผ ์ด๊ณผํ๊ธฐ ์ ๊น์ง๋ ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น์ด ์ผ์ด๋์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ ์์๊ฐ ๋ ์ถ๊ฐ๋์ด size๊ฐ capacity๋ณด๋ค ๋ ์ปค์ง๋ฉด ๊ทธ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น์ด ์ผ์ด๋ฉ๋๋ค.
vector<int> v;
v.reserve(4);
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
cout << v.capacity() << endl;
v.push_back(50);
cout << v.capacity();
[์ถ๋ ฅ๊ฒฐ๊ณผ]
4
6
2) ์ปจํ ์ด๋์ ํฌ๊ธฐ(size) ๋ณ๊ฒฝ resize()
์ปจํ ์ด๋์ size๋ฅผ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌํ ๊ฐ์ผ๋ก ์ฌ์กฐ์ ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ ์ํ ์ ์ โ size๋ฅผ ํค์ธ ๋ capacity๋ ๋์ด๋์ง๋ง, โก size๋ฅผ ์ค์ผ ๋์๋ capacity๊ฐ ๊ฐ์ด ์ค์ง ์๋๋ค๋ ์ ์ ๋๋ค.
๋งค๊ฐ ๋ณ์๋ฅผ ๋ ๊ฐ ์ ๋ฌํ์ฌ ํ์ฅ๋๋ ์์์ ์ด๊น๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
v.resize(20, 5)๋ size๋ฅผ 20์ผ๋ก ๋๋ฆฌ๊ณ , ์ถ๊ฐ๋๋ ์์๋ฅผ 5๋ก ์ด๊ธฐํํ๋ผ๋ ๋ป์ ๋๋ค.
3) swap()
swap()์ ์ด์ฉํ ํ ๋น ๋ฉ๋ชจ๋ฆฌ ์ ๊ฑฐ
vector<int> v(5);
// vector<int>(): ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ด์ฉํ์ฌ ์์ ๊ฐ์ฒด ์์ฑ(capacity: 0)
// vector<int>().swap(v): ์์ฑ๋ ์์ ๊ฐ์ฒด์ v๋ฅผ swap
vector<int>().swap(v);
๋ ์ปจํ ์ด๋ ์์ ์์ ๊ตํ
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
vector<int> v2;
v2.push_back(100);
v2.push_back(200);
v1.swap(v2);
4. empty(), clear()
clear()๋ vector ์์ ์๋ ๋ชจ๋ ์์๋ฅผ ๋น์ฐ๋ผ๋ ๋ป์ด๋ฉฐ, empty()๋ ์ปจํ ์ด๋๊ฐ ๋น์๋์ง์ ์ ๋ฌด๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค.
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
cout << v.empty() << endl;
v.clear();
cout << v.empty();
[์ถ๋ ฅ ๊ฒฐ๊ณผ]
0 // empty(): false
1 // empty(): true
๐ก ์ฐธ์กฐ
1. ์ฒซ ๋ฒ์งธ ์์ ์ฐธ์กฐ front(), ๋ง์ง๋ง ์์ ์ฐธ์กฐ back()
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
cout << v.front() << endl; // ์ฒซ ๋ฒ์งธ ์์ ์ฐธ์กฐ
cout << v.back(); // ๋ง์ง๋ง ์์ ์ฐธ์กฐ
[์ถ๋ ฅ ๊ฒฐ๊ณผ]
10
40
2. [], at()
์ํ์ค ์ปจํ ์ด๋ ์ค ๋ฐฐ์ด ๊ธฐ๋ฐ ์ปจํ ์ด๋์ธ vector์ deque๋ [] ์ฐ์ฐ์์ at() ๋ฉค๋ฒ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
[] ์ฐ์ฐ์์ at() ๋ฉค๋ฒ ํจ์๋ ๊ธฐ๋ฅ์ด๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ต๋๋ค.
[] ์ฐ์ฐ์๋ ๋ฒ์ ์ ๊ฒ์ ํ์ง ์์ง๋ง, at() ๋ฉค๋ฒ ํจ์๋ ๋ฒ์ ์ ๊ฒ์ ํ๋ฉฐ ๋์ํ๋ค๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
<at() ๋ฉค๋ฒ ํจ์ ์ฌ์ฉ ์, ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ out_of_range ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.>
๋ฐ๋ผ์ [] ์ฐ์ฐ์๊ฐ at() ๋ฉค๋ฒ ํจ์๋ณด๋ค ์๋๊ฐ ์กฐ๊ธ ๋ ๋น ๋ฆ ๋๋ค.
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
// [] ์ฐ์ฐ์์ at() ๋ฉค๋ฒ ํจ์๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค.
cout << v[2] << endl;
cout << v.at(2);
[์ถ๋ ฅ ๊ฒฐ๊ณผ]
30
30
๐ก ์ฝ์
1. push_back()
๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌํ ์ธ์๋ฅผ ํด๋น vector์ ๋ท ์ชฝ์ ์ฝ์ ํฉ๋๋ค.
vector<int> v;
v.push_back(100); // 100
v.push_back(200); // 100 200
2. insert()
1) q = v.insert(p, x)
์ฌ๊ธฐ์ p๊ณผ q๋ ๋ฐ๋ณต์์ ๋๋ค.
p๊ฐ ๊ฐ๋ฆฌํค๋ ์๋ฆฌ์ ๊ฐ x๋ฅผ ์ฝ์ ํ๊ณ , ์ฝ์ ํ x์ ์์น๋ฅผ ๋ฐ๋ณต์๋ก ๋ฐํํ์ฌ q์ ์ ๋ฌํด์ค๋๋ค.
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
vector<int>::iterator iter = v.begin() + 2;
vector<int>::iterator iter2;
// iter๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ 100์ ์ฝ์
ํ๋ค.
// iter2: ์ฝ์
๋ 100์ ๊ฐ๋ฆฌํค๋ ๋ฐ๋ณต์
// insert ์ดํ: 10 20 100 30 40
iter2 = v.insert(iter, 100);
for(iter = v.begin(); iter != v.end(); iter++){
// *iter๋ฅผ ํตํด ๊ฐ์ ๊ฐ๋ฆฌํฌ ์ ์๋ค.
cout << *iter << " ";
}
cout << endl;
cout << "iter 2: " << *iter2;
2) v.insert(p, n, x)
p๋ ๋ฐ๋ณต์, n์ ์ฝ์ ํ ์์์ ๊ฐฏ์, x๋ ์ฝ์ ํ ์์์ ๊ฐ์ ๋๋ค.
p๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๊ฐ์ด x์ธ ์์ n๊ฐ๋ฅผ ์ฝ์ ํ๋ผ๋ ๋ป์ ๋๋ค.
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
vector<int>::iterator iter = v.begin() + 2;
// iter๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ์ ์ 100๊ฐ๋ฅผ 3๊ฐ ์ฝ์
// insert ์ดํ: 10 20 100 100 100 30 40
v.insert(iter, 3, 100);
3) v.insert(p, b, e)
p๋ ๋ฐ๋ณต์, b์ e๋ ๊ตฌ๊ฐ์ ๋๋ค.
p๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๊ตฌ๊ฐ [b, e)์ ์์๋ฅผ ์ฝ์ ํ๋ผ๋ ๋ป์ ๋๋ค.
vector<int> v;
v.push_back(100);
v.push_back(200);
vector<int>::iterator iter = v.begin() + 1;
// iter ์์น์ [v.begin(), v.end()) ๊ตฌ๊ฐ์ ์์๋ฅผ ์ฝ์
์
// insert ํ: 100 100 200 200
v.insert(iter, v.begin(), v.end());
๐ก ์ ๊ฑฐ
1. pop_back()
๋งค๊ฐ ๋ณ์๊ฐ ๋ฐ๋ก ์์ผ๋ฉฐ, ํด๋น ๋ฉค๋ฒ ํจ์๋ฅผ ์คํํ๋ฉด vector์ ์ ์ผ ๋ค์ ์๋ ์์๊ฐ ์ ๊ฑฐ๋๋ค.
vector<int> v;
v.push_back(100);
v.push_back(200); // 100 200
v.pop_back(); // 100
v.pop_back(); // empty
2. erase()
1) q = v.erase(p)
q์ p ๋ชจ๋ ๋ฐ๋ณต์์ ๋๋ค.
p๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ์์น์ ์์๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์ ๊ฑฐ๋ ์์์ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฐ๋ณต์๋ฅผ ๋ฐํํ์ฌ q์ ์ ๋ฌํฉ๋๋ค.
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50); // 10 20 30 40 50
vector<int>::iterator iter = v.begin() + 1; // 20์ ์์น๋ฅผ ๊ฐ๋ฆฌํด
vector<int>::iterator iter2;
iter2 = v.erase(iter); // 10 30 40 50
2) q = v.erase(b, e)
q๋ ๋ฐ๋ณต์, b์ e๋ ๊ตฌ๊ฐ์ ๋ปํฉ๋๋ค.
๊ตฌ๊ฐ [b, e)์ ์์๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์ ๊ฑฐํ ์์์ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฐ๋ณต์๋ฅผ ๋ฐํํ์ฌ q์ ์ ๋ฌํฉ๋๋ค.
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50); // 10 20 30 40 50
vector<int>::iterator iter;
// [v.begin(), v.begin() + 2) ๊ตฌ๊ฐ: 10, 20์ ์์๋ฅผ ์ ๊ฑฐ
iter = v.erase(v.begin(), v.begin() + 2); // 30 40 50
๐ก vector ์ปจํ ์ด๋ ์ฃผ์ ํน์ง ์ ๋ฆฌ
1. vector๋ ์ํ์ค ์ปจํ ์ด๋์ด๋ฉฐ ๋ฐฐ์ด ๊ธฐ๋ฐ ์ปจํ ์ด๋ ์ ๋๋ค.
2. ๋ฐฐ์ด ๊ธฐ๋ฐ ์ปจํ ์ด๋์ด๊ธฐ ๋๋ฌธ์ ์์๊ฐ ์ถ๊ฐ ๋๊ฑฐ๋ ์ฝ์ ๋ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น์ด ์ผ์ด๋ ์ ์๊ณ , ์ด๋ ์๋นํ ๋น์ฉ์ด ๋ค๊ฒ ๋ฉ๋๋ค.
3. capacity()๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํฌ๊ธฐ๊ฐ ์ผ๋ง์ธ์ง ํ์ธํ ์ ์์ต๋๋ค.
4. reserve()๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ(capacity)๋ฅผ ํ ๋น(์์ฝ)ํ ์ ์์ต๋๋ค.
5. ์์๊ฐ ์ฐ์ํ๊ฒ ์ ์ฅ๋๋ฏ๋ก [], at()์ ๊ฐ์ด ํน์ ์์์ ์์๋ก ์ ๊ทผํ ์ ์์ผ๋ฉฐ ์๋๊ฐ ๋น ๋ฅธ ํธ์ ๋๋ค.
[]๋ ๋ฒ์ ๊ฒ์ฌ๋ฅผ ํ์ง ์๋ ๋์ ์๋๊ฐ ์กฐ๊ธ ๋ ๋น ๋ฅด๊ณ , at()๋ ๋ฒ์ ๊ฒ์ฌ๋ฅผ ํ๋ ๋์ ์๋๊ฐ ์กฐ๊ธ ๋ ๋๋ฆฝ๋๋ค.
ํ์ง๋ง insert(), erase(), push_back() ๋ฑ์ด ๋น๋ฒํ๊ฒ ํธ์ถ๋์ด์ผํ๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด ๋ค๋ฅธ ์ปจํ ์ด๋ ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
6. ์ํ์ค ๊ธฐ๋ฐ ์ปจํ ์ด๋ ์ด๋ฏ๋ก front(), back(), push_back(), pop_back() ๋ฉค๋ฒ ํจ์๋ฅผ ์ง์ํฉ๋๋ค.
ํ์ง๋ง ๋์์ ๋ฐฐ์ด ๊ธฐ๋ฐ ์ปจํ ์ด๋์ด๋ฏ๋ก ์ ์ชฝ์์ ์๋ํ๋ ๋ฉค๋ฒ ํจ์๋ ์ง์ํ์ง ์์ต๋๋ค. ์ด๋ vector ์ปจํ ์ด๋์์ ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐธ๊ณ ์ฑ : ๋๋ฅผ ์๊ทนํ๋ C++ STL