ํฌ์ŠคํŠธ

Array ๋ฐฐ์—ด

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 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.