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::arrayContainerReversibleContainer 요구사항을 만족해요. 단, 기본 생성된 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++의 기본 배열 타입이에요.

더 알아보기 (Learn more)

cppreference