std::array
std::array (고정 크기 배열 컨테이너)
고정 크기 배열을 캡슐화하는 컨테이너예요. C 스타일 배열의 성능과 접근성을 표준 컨테이너의 이점(자기 크기 인지, 대입 지원, 임의 접근 반복자 등)과 결합해요. C++11부터 있어요.
출처: cppreference
본문
<array> 헤더에 정의돼 있고, 고정 크기 배열을 캡슐화해요.
template<
class T,
std::size_t N
> struct array;
이 컨테이너는 C 스타일 배열 T[N]을 유일한 비정적 데이터 멤버로 갖는 구조체와 동일한 의미를 가진 애그리게이트 타입이에요. C 스타일 배열과 달리 T*로 자동 붕괴(decay)되지 않아요. 애그리게이트이므로, T로 변환 가능한 최대 N개의 초기화자로 애그리게이트 초기화할 수 있어요: std::array<int, 3> a = {1, 2, 3};.
이 구조체는 C 스타일 배열의 성능·접근성과 표준 컨테이너의 이점(자기 크기 인지, 대입 지원, 임의 접근 반복자 등)을 결합해요.
std::array는 Container와 ReversibleContainer 요구사항을 만족해요. 단, 기본 생성된 array가 비어 있지 않고 swap의 복잡도가 선형이라는 점이 달라요. ContiguousContainer 요구사항을 만족하고(C++17), SequenceContainer 요구사항을 부분적으로 만족해요.
길이가 0인 배열(N == 0)은 특별한 경우예요. 그 경우 array.begin() == array.end()이며 어떤 유일한 값이에요. 크기 0 배열에서 front()나 back()을 호출하는 효과는 정의되지 않아요.
array는 같은 타입의 N개 원소를 가진 tuple로도 쓸 수 있어요.
반복자 무효화 (Iterator invalidation)
일반적으로 array에 대한 반복자는 array의 수명 동안 절대 무효화되지 않아요. 다만 swap 중에는 반복자가 계속 같은 array 원소를 가리키므로 그 값이 바뀔 수 있다는 점에 주의해야 해요.
템플릿 매개변수
T: 원소 타입. 원소에 부과되는 요구사항은 컨테이너에서 실제 수행되는 연산에 따라 달라져요. 일반적으로 원소 타입이 완전 타입이고Erasable요구사항을 만족해야 하지만, 일부 멤버 함수는 더 엄격한 요구사항을 부과해요.N: 배열 안의 원소 개수 (0일 수 있음).
멤버 타입
value_type=T,size_type=std::size_t,difference_type=std::ptrdiff_t,reference=value_type&,const_reference=const value_type&,pointer=value_type*,const_pointer=const value_type*.iterator: (C++20부터)value_type에 대한LegacyRandomAccessIterator,contiguous_iterator,ConstexprIterator.const_iterator:const value_type에 대한 동일한 종류의 반복자.reverse_iterator=std::reverse_iterator<iterator>,const_reverse_iterator=std::reverse_iterator<const_iterator>.
멤버 함수
- 암시적으로 선언된 생성자(애그리게이트 초기화 규칙을 따름), 소멸자(원소 파괴),
operator=(원소 대입). - 원소 접근:
at(범위 검사 포함 접근),operator[],front,back,data(연속 저장소 직접 접근). - 반복자:
begin/cbegin,end/cend,rbegin/crbegin,rend/crend. - 용량:
empty,size,max_size. - 연산:
fill(지정 값으로 채움),swap.
비멤버 함수
operator==,operator!=,<,<=,>,>=,<=>: 두 array 사전식 비교.get(std::array)(C++11): array 원소 접근.std::swap(std::array)(C++11):std::swap알고리즘 특수화.to_array(C++20): 내장 배열에서std::array생성.
헬퍼 클래스
std::tuple_size<std::array>(C++11): array 크기 획득.std::tuple_element<std::array>(C++11): array 원소 타입 획득.
C++17부터 추론 가이드(deduction guide)가 있어요.
예제를 보면 초기화와 연산을 확인할 수 있어요.
#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <string>
int main()
{
// 생성은 애그리게이트 초기화를 사용
std::array<int, 3> a1{{1, 2, 3}}; // C++11 초기엔 이중 중괄호 필요
std::array<int, 3> a2 = {1, 2, 3}; // = 뒤에선 이중 중괄호 불필요
// 컨테이너 연산 지원
std::sort(a1.begin(), a1.end());
std::ranges::reverse_copy(a2, std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
// 범위 for 루프 지원
std::array<std::string, 2> a3{"E", "\u018E"};
for (const auto& s : a3)
std::cout << s << ' ';
std::cout << '\n';
// C++17 이후 추론 가이드
std::array a4{3.0, 1.0, 4.0}; // std::array<double, 3>
}
출력:
3 2 1
E Ǝ
이렇게 std::array는 C 스타일 배열의 성능을 유지하면서도 표준 컨테이너 인터페이스를 제공하는 현대 C++의 기본 배열 타입이에요.