포슀트

πŸŒ“ 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();


πŸ’« λ©”λͺ¨


이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.