[C++] Array
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;