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