2025. 4. 8. 17:43ㆍProgramming Language/C++
1. std::array
std::array는 C++11부터 도입된 고정 크기 배열 컨테이너로, C 배열(int arr[5])의 단점을 보완하면서 STL의 장점(반복자, 알고리즘, 범위 검사 등)을 제공하는 템플릿 클래스이다
std::array를 사용한다면 array라는 라이브러리를 include 해줘야한다.
#include <array>
2. 기본 문법
std-array의 선언은 아래와 같이 사용한다.
std::array<자료형, 크기> 변수이름;
실 예시는
std::array<int, 5> arr = {1, 2, 3, 4, 5};
와 같이 사용이 된다.
일반 배열은 초기화하면서 선언하는 경우엔 배열의 크기를 지정하지 않아도 초기화하는 값의 길이에 맞춰 크기를 맞췄으나 std::array의 경우는 불가능하다.
이는 array자체가 내부적으로 크기를 무조건 받아야하도록 구현이 되어 있기 때문이다.
물론 초기화 없이 선언도 가능하다.
std::array<int, 5> arr; // - 초기화되지 않은 값 쓰레기값으로 초기화
std::array<int, 5> arr = {}; // - 초기화되지 않은 값 0으로 초기화
std::array<int, 5> arr{}; // - 초기화되지 않은 값 0으로 초기화
std::array<int, 5> arr{1, 2}; // - 초기화되지 않은 값 0으로 초기화
std::array<int, 5> arr{1, 2, 3, 4, 5};
위 방식 네 방식은 모두 가능한 선언 방식이다.
3. 사용 방식
std::array도 그냥 일반 배열과 동일하게 사용이 가능하다.
4. std::array의 멤버함수
std:array에는 사용가능한 함수들이 존재한다.
하나씩 살펴보자면
1) .size() : 배열의 크기를 반환
기존의 배열의 경우는 std에 존재하는 size함수에 전달해서 크기를 확인했었다.
2) .at(i) : 범위 검사가 포함된 배열에 접근 방식(예외 발생이 가능하다)
기존에 배열에서 사용하던
이 방식과 동일한 사용방법이다
다만 기존에 저렇게 배열이 선언되었을때 그 크기를 벗어나는 값에 접근하게 되면
이렇게 쓰레기값을 출력하고 코드 : 0 으로 main함수가 0을 반환하면서 종료가 됐었는데
.at함수를 사용하면
이렇게 에러를 띄워준다.
그리고 그 결과도 이상하게 코드 : 1073741855 라면서 이상하게 표출된다.
3) .front() : 첫 번째 요소 참조
4) .back() : 마지막 요소 참조
5) .fill(value) : 모든 요소를 value로 채움
6) .data() : 내부 배열 포인터 반환
일반 배열의 경우는 배열의 이름을 전달하면 배열의 주소값을 전달했었는데 std::array의 경우는 주소값을 전달해주지 않는다.
그렇기에 std::array의 주소값을 찾아 줄 함수가 필요하다
그때 사용되는데 .data()함수이다.
void foo(int* ptr) {
// C 스타일 API
}
foo(arr.data()); // ✅ 정확하게 주소가 넘어감
그래서 사실
이런 사용도 가능하다
이는
std::array<int, 5> arr1{ 1, 2, 3, 4, 5 };
로 만들어진 실제 내부 배열(std::array가 구현될때 내부에 배열을 만들어서 이런 사용이 가능하게 되는거고 그 내부배열에 직접 접근하는 것을 의미함)에 접근해서 사용하는 것이기 때문이다.
7) arr1.swap(arr2) : 같은 타입의 두 배열의 내용을 통째로 전환
std::array<int, 5> a = {1, 2, 3, 4, 5};
std::array<int, 5> b = {6, 7, 8, 9, 10};
a.swap(b); // a와 b의 내용을 바꾼다
유의할 점은 타입이 같아야하고 크기가 같아야한다는 점이다.
8) 배열의 복사
std::array의 경우는 일반배열이 못하던 배열의 이름만 갖고 복사하던것도 가능하다.
std::array<int, 5> arr1 {1, 2, 3, 4, 5};
std::array<int, 5> arr2;
arr2 = arr1;
'Programming Language > C++' 카테고리의 다른 글
Ch07. 포인터 - 01. 포인터의 기본 (0) | 2025.04.08 |
---|---|
Ch06. 복합데이터 - 09. Range-based for (0) | 2025.04.08 |
Ch06. 복합데이터 - 07. 열거형(enum) (0) | 2025.04.08 |
Ch06. 복합데이터 - 06. 공용체(union) (0) | 2025.04.02 |
Ch06. 복합데이터 - 05. 구조체 (0) | 2025.04.02 |