C++

[C++] Array

햇썽이 2025. 5. 29. 00:58

array 선언과 초기화

std::array는 고정된 크기의 배열을 선언할 때 사용되며, 크기는 템플릿 인자로 고정된다.

#include <array>

array<int, 1000> arr{1, 2, 3};

명시적으로 값을 지정하지 않은 요소들은 0으로 초기화되지 않고 쓰레기값이 들어갈 수 있다.

요소 접근과 경계 검사

일반적인 배열처럼 인덱스를 통해 요소에 접근할 수 있으며, at()을 이용하면 범위 검사까지 수행된다.

cout << arr[-1] << endl;       // 쓰레기값 출력
cout << arr.at(0) << endl;     // 1 출력
cout << arr.at(-1) << endl;    // 예외 발생

at()은 배열의 경계를 벗어나는 접근을 할 경우 런타임 에러를 발생시켜 디버깅에 도움이 된다.

배열의 크기 확인

std::array는 size() 멤버 함수를 통해 배열의 크기를 반환한다.

cout << arr.size() << endl;

기존 배열은 sizeof 연산으로 크기를 계산해야 한다.

int arr0[5] = {1, 2, 3};
cout << sizeof(arr0) / sizeof(int) << endl; // 5 출력

앞/뒤 요소 접근

front()와 back() 함수로 배열의 첫 번째와 마지막 요소를 빠르게 접근할 수 있다.

cout << arr.front() << endl; // 1
cout << arr.back() << endl;  // 0 (초기화 안된 쓰레기값)

배열 간 복사 및 교환

std::array는 = 연산자를 통해 전체 복사가 가능하며, swap()을 이용해 두 배열의 값을 교환할 수 있다.

array<int, 5> arr0{1, 2, 3, 4, 5};
array<int, 5> arr1{5, 4, 3, 2, 1};

arr0.swap(arr1);
arr0 = arr1;

배열 비교

같은 길이와 타입의 std::array는 ==, !=, <, > 등의 비교 연산이 가능하다.

if (arr0 == arr1)
{
    cout << "일치합니다" << endl;
}

비교는 앞에서부터 순서대로 진행되며, 처음 다른 요소를 기준으로 판단한다.

크기 비교시 배열 첫번째부터 한개씩 검사하며 만약에 값이 같다면 그다음 순서 것 차례차례 넘어가서 비교후 큰/작은값일 경우 그 배열을 내보낸다. 

배열 원시 포인터 접근

data()를 이용하면 내부 배열의 포인터를 얻을 수 있다.

cout << arr0.data()[0] << endl;

문자 배열 선언 시 주의

문자 배열을 선언할 경우 널 종료 문자를 위해 하나 더 크게 선언해야 한다.

array<char, 6> arr0{"abcde"};

크기를 충분히 확보하지 않으면 문자열이 비정상적으로 종료될 수 있다.

배열 출력 루프

전통적인 for 루프를 통해 std::array 요소를 출력할 수 있다.

for (int i = 0; i < arr0.size(); ++i)
    cout << arr0[i];
cout << endl;

for (int i = 0; i < arr1.size(); ++i)
    cout << arr1[i];
cout << endl;

범위를 벗어난 인덱스 접근

std::array도 인덱스를 벗어난 접근 시 쓰레기값을 반환하거나 런타임 에러가 발생할 수 있다.

cout << arr[100] << endl;