Array ๋ฐฐ์ด
๐ซ ์ ์
๋ฉ๋ชจ๋ฆฌ ์์ ์์๋ฅผ ์ฐ์ํ๊ฒ ๋ฐฐ์นํ ์๋ฃ๊ตฌ์กฐ
๐ซ ์ฑ์ง
๐ซง ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ํ๊ฒ ๋ฐฐ์น
์์์ ๊ทผ Random-Access
ํน์ ์์น๋ฅผ ์๊ณ ์ถ๋ค๋ฉด? ๊ทธ๋ฅ ์์ ์์น์์ ๋ฐ์ดํฐ ํฌ๊ธฐ * ์์น๋ฅผ ๋ํด์ฃผ๋ฉด ๋ฐ๋ก ์ ์ ์์
๋ฉ๋ชจ๋ฆฌ ์์ โ์ฐ์ํ๊ฒโ ์์นํด ์์ผ๋๊น
Like ์ํ๊ด์์ ์ง์ธ๋ค๊ณผ ๋๋ํ ์ข์์ ์๋งคํ ๋
๋ค๋ฅธ ์ง์ธ์ด ๋ ์จ๋ค๋ฉด, ๋๋ํ ์๊ธฐ ์ํด์ ์ฐ์๋ ์๋ฆฌ๋ฅผ ์ฐพ์ ์ด๋ํด์ผ ํจ
๋ ๋ง์ ์ง์ธ์ด ์ฌ ์๋ก, ์๋งค๋ ๋น์ฉ๋ ์ปค์ง๊ณ ์ด๋๋ ํ๋ค์ด์ง
์คํจํ ์๋ ์์! ์ฐ์๋ ์๋ฆฌ๊ฐ ์๋ค๋ฉด ! (๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด ์คํจํ ์ ์๋ ๊ฑด ๋น์ฐํ์ง๋ง, ์ฌ๊ธฐ์ ๋งํ๊ณ ์ ํ๋๊ฑด โ์ฐ์๋โ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์๋ค๋ฉด!)
๋ฐฐ์ด์ ์ ์์๋ฅผ ์ถ๊ฐํ๋ ์ผ์ ์ฝ์ง ์์ ์ผ
๋ฏธ๋ฆฌ ์ถฉ๋ถํ ์ข์์ ์๋งคํ๋ค๋ฉด
์ถ๊ฐํ ์ผ์ด ์๊ธฐ์ง ์๋ ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น (๋ฐฐ์ด์์ ์ฐ์ง๋ ์์ง๋ง, ๋ค๋ฅธ ์ชฝ์์๋ ๋ชป์)
๋ง์ฝ์ ์ง์ธ์ด ๋ฏธ๋ฆฌ ์๋งคํด๋ ์๋ณด๋ค ๋ง์์ง๋ค๋ฉด ์ด์ฐจํผ ๋ค์ ์๋งคํด์ผ ํจ
์ข์ ํด๊ฒฐ์ฑ
์ด์ง๋ง, ์๋ฒฝํ์ง๋ ์์
-> ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- O(1)์ k๋ฒ์งธ ์์๋ฅผ ํ์ธ/๋ณ๊ฒฝ ๊ฐ๋ฅ
- ์ถ๊ฐ์ ์ผ๋ก ์๋ชจ๋๋ ๋ฉ๋ชจ๋ฆฌ์ ์(=overhead)๊ฐ ๊ฑฐ์ ์์
- Cache hit rate๊ฐ ๋์
๋ฉ๋ชจ๋ฆฌ ์์ ์ฐ์ํ ๊ตฌ๊ฐ์ ์ก์์ผ ํด์ ํ ๋น์ ์ ์ฝ์ด ๊ฑธ๋ฆผ
- ์๋ฃ๊ตฌ์กฐ๋ก์จ์ ๋ฐฐ์ด, ๊ธธ์ด๋ฅผ ๋ง์๋๋ก ๋๋ฆฌ๊ฑฐ๋ ์ค์ด๋๊ฒ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐ
๐ซง ์๊ฐ๋ณต์ก๋
- ์์์ ์์น์ ์๋ ์์๋ฅผ ํ์ธ/๋ณ๊ฒฝ, O(1)
- ์์๋ฅผ ๋์ ์ถ๊ฐ, O(1)
- ๋ง์ง๋ง ์์๋ฅผ ์ ๊ฑฐ, O(1)
- ์์์ ์์น์ ์์๋ฅผ ์ถ๊ฐ/์ ๊ฑฐ, O(N)
๐ซ ์ฌ์ฉ
๐ซง C++ Array
์ปดํ์ผ ์๊ฐ์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๊ณ ๋ ์ด์ ํฌ๊ธฐ์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ ์ ์ ๋ฐฐ์ด
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Declaration & Definition & Init
int a[21]; // [21] : Index ์์ธ/Subscript ์ฒจ์
int b[21][21];
int c[21] = { 1, 2, 3 }; // { 1, 2, 3, 0, 0 }
int d[] = { 1, 2, 3 };
int d[] { 1, 2, 3 }; // Universal Initialization
// 1. memset
#include <cstring>
memset(a, 0, sizeof a);
memset(b, 0, sizeof b);
// 2. for
for (int i = 0; i < 21; i++)
a[i] = 0;
for (int i = 0; i < 21; i++)
for (int j = 0; j < 21; j++)
b[i][j] = 0;
// 3. fill
#include <algorithm>
fill(a, a + 21, 0);
for (int i = 0; i < 21; i++)
fill(b[i], b[i] + 21, 0);
๐ซง C++ STL vector
์คํ์๊ฐ์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋์ ๋ฐฐ์ด
๋ฉ๋ชจ๋ฆฌ ์ฐ์ํ๊ฒ ์ ์ฅ
ํฌ๊ธฐ๋ฅผ ์์ ์์ฌ๋ก ๋๋ฆฌ๊ฑฐ๋ ์ค์ด๊ฑฐ๋
๊ทธ๋ํ์ ์ธ์ ๋ฆฌ์คํธ๋ผ๋ ๊ฒ์ ์ ์ฅํ ๋์๋ vector๋ฅผ ์ฐ๋๊ฒ ๋ง์ด ํธํด์ vector๊ฐ ํ์ํ๊ฒ ๋์ง๋ง,
๊ทธ ์ ๊น์ง๋ ์ฌ์ค ๊ตณ์ด ๋ฐฐ์ด๋์ vector๋ฅผ ์จ์ผํ๋ ์ํฉ์ ์๋ค.
์์ฑ๊ณผ ์๋ฉธ์ ํ๋๋ฐ ์๋นํ ์๊ฐ์ด ์์๋๋ค. (์ฑ๋ฅ)
1
2
3
4
5
6
7
8
9
10
// Declaration & Definition & Init
#include <vector>
vector<int> v1;
vector<int> v1 = { 0, 0, 0 };
vector<int> v1 { 0, 0, 0 };
vector<int> v1(1); // { 0 };
vector<int> v1(size); // ๋ณ์, ๋์ ์์ฑ ์
vector<int> v1(3, 4); // { 4, 4, 4 };
vector<int> v1.assign(3, 4); // { 4, 4, 4 };
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Use
v1.size();
v1.push_back(1);
v1.pop_back();
v1.clear();
// iterator
v1.begin(); // ์์ ์ฃผ์
v1.end(); // ๋ ์ฃผ์ + 1
v1.rbegin(); // (๋ ์ฃผ์)๋ฅผ ์์์ผ๋ก
v1.rend(); // (์์ ์ฃผ์ + 1) ์ ๋์ผ๋ก
v1.insert(v1.begin() + 1, 1); // { 0, 3, 0 };
v1.erase(v1.begin() + 1); // { 1, 2, 4 };
// Deep Copy (์ด๊ฒ์ ์ฐ์ฐ์ ์ค๋ณต ์ ์)
v1 = v2;
// ์์์ ๊ฐ์์ ๊ฐ์ด ๋ชจ๋ ์ผ์นํ๋ฉด true (์ด๊ฒ ์ญ์ ์ฐ์ฐ์ ์ค๋ณต ์ ์)
(v1 == v2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Traversal
// 1. range-based for loop (since C++11)
for (int e : v1)
for (int& e : v1)
// & <- list, map, set ๋ฑ์์๋ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋
// 2. for (not bad)
for (int i = 0; i < v1.size(); i++)
// 2-1. ***WRONG***
// size()๊ฐ unsigned int์ด๊ธฐ ๋๋ฌธ์,
// ๋น vector์ size() 0์์ -1์ ํด๋ฒ๋ฆฌ๋ฉด
// (unsigned int)0 - (int)1 = 4294967295
for (int i = 0; i <= v1.size() - 1; i++)
๐ซง C++ STL array
์ผ๋ถ ํจ์๋ฅผ ์ ๊ณตํ๋ ์ ์ ๋ฐฐ์ด
1
2
3
4
// Declaration & Definition & Init
#include <array>
array<int, 3> a { 1, 2, 3 };
1
2
3
4
5
6
7
// Use
a.size();
a.fill(1);
a.empty();
a.at();
a.front();
a.back();
๐ซ ๋ฉ๋ชจ
- @ TODO