하찮은 19학번 컴공대생
yoonbot's devlog

알고리즘 저장소 (Algorithm Library) ⏱/Data Structures (자료구조)

< C++ > STD Arrays (Array 컨테이너)

yoonbot_code 2021. 8. 13. 15:16

지난 글에는 벡터로 통해 통적 배열 (dynamic array)을 조정하는 방법을 알아봤다. 벡터에 어떤 기능들이 주어졌는지 살펴보고 응용하는 방법도 살펴보았다. 이번 계시물에서는 array 템플리 클라스로 인해 어떻게 고정 배열을 안정시키는 방법을 알아보겠다.

 

 

array 오브젝트를 선언하는 법은 다음과 같다.

#include <array>
using namespace std;
...
array<int, 4> arr1 = { 1, 2, 3, 4 };
array<int, 3> arr2;
array<char, 3> arr3 = { 'G', 'E', 'T' };
array<int, 5> arr4{{ 3, 4, 5, 1, 2 }};

 

 

1. 벡터랑 유사한 array 컨테이너의 기능들

이 기능들은 말 그대로 벡터에서 사용 가능한 기능들과 유사하다. 벡터를 공부해봤으면 아래 기능들이 낯이 익힐 거다. 

 

1. [ index ] 부호 / at(index) - 위치에 저장된 배열의 값을 리턴한다.

2. front() / back() - 배열에 맨 앞/ 뒤 에 저장된 값을 리턴한다. 

3. swap(arr) - 배열 두 개의 값을 서로 바꿔치기 한다. 

4. empty() - 배열 컨테이너가 비어있는지 확인 시켜준다. 

5. fill(size) - 베터에서는 assign() 역할이랑 동일하다. 

6. size() / max_size() - 배열의 크기 / 저장할 수 있는 만큼의 요소의 개수를 리턴한다. 

7. sizeof(arr) - 배열이 할당한 공간을 바이트 개수로 리턴한다. 

8. data() -  포인터 역할을 하고 배열 값의 주소값을 가르킨다. 

9. begin() end() / cbegin() cend() / rbegin() rend() / crbegin() crend() - 베열 컨테이너에서도 역시 반복자 역할을 맡은다.

 

 

더 자세히 위 기능들을 살펴보고 싶다면 전 계시물을 참고하도록. 

 

 

< C++ > Vectors (벡터)

해당 계시물은 내가 벡터에 대한 주제를 아래와 같이 이해 했으니 정확하지 않을 수도 있다. 자료구조 처음 접하자마자 바로 배열 (Array)로 복습 들어가봤을 것이다. 그 중에서 기초적인 기능들,

yoonbot-dev.tistory.com

 

 

위 기능들을 응용하는 법은 아래와 같다. 

 

#include <iostream>
#include <array>
using namespace std;

int main(){
    array<char, 3> arr = { 'G', 'f', 'G' };
    array<char, 3> arr2 = { 'M', 'M', 'P' };
    array<int, 5> arr3;

    cout << arr[0] << " " << arr[2];
    // 결과 출력:  G  G

    cout << arr.at(0) << " " << arr.at(2);
    // 결과 출력:  G  F

    cout << arr.front() << " " << arr.back();
    // 결과 출력:  71  71  (ASCII 값 'G' = 71)

    arr.swap(arr2);
    cout << arr.front() << " " << arr.back();
    // 결과 출력:  77  80  (ASCII 값 'M' = 77, 'P' = 80)

    bool x = arr.empty();
    cout << x;
    // 결과 출력: 0 (실제로 false 출력하려면 boolalpha 사용해야함)

    cout << arr3.fill(5);
    // 결과 출력:  5  5  5  5  5

    cout << arr3.size() << " " << arr.size();
    // 결과 출력:  5  3

    cout << sizeof(arr3)
    // 결과 출력:  20 (int가 4byte니까 총 4 * 5 = 20byte 할당 됨)

    cout << arr3.max_size() << " " << arr.max_size();
    // 결과 출력:  5  3

    cout << arr3.data() << " " << *(arr3.data() + 2);
    // 결과 출력:  002AF9D0 (주소값)   5


    return 0;
}

 

2. 벡터와 Array - 둘 중 언제 써야할까?

본론부터 들어가자면 벡터는 통적 배열 (dynamic array)에 주로 사용된다. 따라서, 프로그램 내에 배열 크기가 변경 될 경우에 벡터 텀플렛 클래스가 더 적절하다. 하지만 프로그램 내에 배열의 크기가 고정되며 변경되지 않을 경우 벡터보다 배열 컨테이너가 더 적절하다. 벡터 컨테이너는 고정 배열을 확보하며 어수선한 포인터 변환으로 인한 에러들이 나타날 확률을 줄인다. 만약 씨언어의 배열이 알겡이라는걸 가정하면 C++의 배열 템플렛 클래스는 마치 알갱이의 껍대기 역할을 한다고 보면 된다.