본문 바로가기

IT/Programming Language

[C++/STL] STL 사용법 : Container - Array

반응형

Array

std::array는 C++11부터 표준 라이브러리에 포함된 STL 컨테이너로, 고정된 크기의 배열을 보다 안전하고 편리하게 사용할 수 있도록 합니다.

 

특징

  1. 고정 크기 : std::array의 크기는 컴파일 타임에 결정되며, 런타임 동안 변경할 수 없습니다.
  2. 연속된 메모리 배치 : 내부적으로 C 스타일 배열과 같이 연속된 메모리 블록에 저장되므로, 기존 배열 기반 코드와의 호환성이 좋습니다.
  3. 사용 편의성: .size() 같은 멤버 함수를 통해 크기를 쉽게 알 수 있고, 범위 기반 for 루프와 같은 C++의 다양한 기능과 함께 사용할 수 있습니다.
  4. 안전성: at() 멤버 함수를 통해 배열 요소에 접근하면 범위를 벗어난 접근 시 예외가 발생하여 더 안전한 코드 작성이 가능합니다.

※ 왜 Array Container를 사용할까?

  1. 안전성: std::arrayat() 메서드를 통해 안전하게 요소에 접근할 수 있으며, 범위를 벗어난 인덱스 접근 시 예외를 발생시킵니다. 이는 일반 C 배열에서는 발생하지 않는 안전장치입니다.
  2. 쉬운 크기 관리: std::arraysize() 메서드를 제공하여 배열의 크기를 쉽게 확인할 수 있습니다. 그러나 C 스타일 배열은 크기에 대한 정보가 포함되어 있지 않습니다.
  3. 일관된 API: STL 컨테이너들은 일관된 인터페이스를 제공하므로, 다양한 STL 컨테이너 간의 사용성이 높습니다. 코드를 작성할 때 더 직관적이고 유지보수가 용이합니다.
  4. 범위 기반 for 루프 지원: std::array는 범위 기반 for 루프와 같은 C++11의 기능을 사용할 수 있어 코드가 더 간결하고 읽기 쉬워집니다.
  5. 연산자 오버로딩: std::array는 다양한 연산자(예: [], ==, !=, > 등)를 오버로딩하여 배열 비교 및 요소 접근이 더 간편합니다.
  6. 컨테이너의 특징 활용: STL의 다른 기능(정렬, 검색 등)을 사용할 수 있으며, 알고리즘과 쉽게 통합이 가능합니다.
  7. 메모리 관리: C 스타일 배열은 메모리 할당에 대한 처리를 프로그래머가 직접 해야 하지만, std::array는 스택 기반으로 관리되어 메모리 관리가 단순합니다.

 

 

선언

#include <array>
std::array<int, 길이> 변수명 = {초기값};

// example
std::array<int,5> arr = {1,2,3,4,5};
// 위의 선언에서 arr={1,2,3}; 으로 한다면 나머지 값 들은 0으로 채워짐.

 

함수

Iterators

함수 설명
begin() 첫번째 원소를 가리키는 iterator를 반환
end() 마지막 원소의 다음을 가리키는 iterator를 반환
cbegin() 첫번째 원소를 가리키는 상수 iterator를 반환
cend() 마지막 원소의 다음을 가리키는 상수 iterator를 반환
rbegin() 역 순차열의 첫 번째 원소를 가리키는 iterator를 반환
rend() 역 순차열의 마지막 원소의 다음을 가리키는 iterator를 반환
crbegin() 역 순차열의 첫 번째 원소를 가리키는 상수 iterator를 반환
crend() 역 순차열의 마지막 원소의 다음을 가리키는 상수 iterator를 반환

 

 

기타 접근 또는 사용 관련

함수 설명
front() 첫번째 원소의 값
back() 마지막 원소의 값
at(int N) N번째 원소 값
[] 연산자 인덱스를 통한 값 접근 허용
empty() 비어있다면 true, 아니라면 false 반환
size() 크기 반환
fill(T value) arr내부 모든 원소의 값을 value로 바꿈 ( arr[]로 선언한 배열에는 적용불가 )
swap(array arr2) ( 길이와 type이 같다면 ) 서로의 배열 원소들을 바꿈

 

 

사용 예시

#include <iostream>
#include <array>

using namespace std;

int main() {
    // 선언
    array<int, 5> arr = { 1,2,3,4,5 };

    // arr.empty
    cout << arr.empty() << endl;

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

    // 단일 원소 출력
    cout << arr[2] << endl;

    // arr.front, arr.back
    cout << arr.front() << "\t" << arr.back() << endl;

    // arr.at
    cout << arr.at(3) << endl;

    // 반복문 출력
    for (int i = 0; i < arr.size(); i++)
        cout << arr[i] << endl;

    // 반복문 출력 (iterator 사용)
    for (auto it = arr.begin(); it != arr.end(); it++)
        cout << *it << endl;

    for (auto it = arr.rbegin(); it != arr.rend(); it++)
        cout << *it << endl;

    // arr.fill
    array<int, 5> arrFill = { 1,2,3,4,5 };
    arrFill.fill(10);
    for (auto it = arrFill.begin(); it != arrFill.end(); it++)
        cout << *it << endl;

    // arr.swap
    array<int, 5> arr1 = { 1,2,3,4,5 };
    array<int, 5> arr2 = { 6,7,8,9,10 };
    arr1.swap(arr2);
    for (auto it = arr1.begin(); it != arr1.end(); it++)
        cout << *it << endl;
}

 

 

반응형