반응형
Array
std::array
는 C++11부터 표준 라이브러리에 포함된 STL 컨테이너로, 고정된 크기의 배열을 보다 안전하고 편리하게 사용할 수 있도록 합니다.
특징
- 고정 크기 :
std::array
의 크기는 컴파일 타임에 결정되며, 런타임 동안 변경할 수 없습니다. - 연속된 메모리 배치 : 내부적으로 C 스타일 배열과 같이 연속된 메모리 블록에 저장되므로, 기존 배열 기반 코드와의 호환성이 좋습니다.
- 사용 편의성:
.size()
같은 멤버 함수를 통해 크기를 쉽게 알 수 있고, 범위 기반 for 루프와 같은 C++의 다양한 기능과 함께 사용할 수 있습니다. - 안전성:
at()
멤버 함수를 통해 배열 요소에 접근하면 범위를 벗어난 접근 시 예외가 발생하여 더 안전한 코드 작성이 가능합니다.
※ 왜 Array Container를 사용할까?
- 안전성:
std::array
는at()
메서드를 통해 안전하게 요소에 접근할 수 있으며, 범위를 벗어난 인덱스 접근 시 예외를 발생시킵니다. 이는 일반 C 배열에서는 발생하지 않는 안전장치입니다.- 쉬운 크기 관리:
std::array
는size()
메서드를 제공하여 배열의 크기를 쉽게 확인할 수 있습니다. 그러나 C 스타일 배열은 크기에 대한 정보가 포함되어 있지 않습니다.- 일관된 API: STL 컨테이너들은 일관된 인터페이스를 제공하므로, 다양한 STL 컨테이너 간의 사용성이 높습니다. 코드를 작성할 때 더 직관적이고 유지보수가 용이합니다.
- 범위 기반 for 루프 지원:
std::array
는 범위 기반 for 루프와 같은 C++11의 기능을 사용할 수 있어 코드가 더 간결하고 읽기 쉬워집니다.- 연산자 오버로딩:
std::array
는 다양한 연산자(예:[]
,==
,!=
,>
등)를 오버로딩하여 배열 비교 및 요소 접근이 더 간편합니다.- 컨테이너의 특징 활용: STL의 다른 기능(정렬, 검색 등)을 사용할 수 있으며, 알고리즘과 쉽게 통합이 가능합니다.
- 메모리 관리: 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;
}
반응형
'IT > Programming Language' 카테고리의 다른 글
[C++/STL] STL 사용법 : Container - Deque (0) | 2025.02.23 |
---|---|
[C++/STL] STL 사용법 : Container - Vector (0) | 2025.02.15 |
[Java] 어노테이션 (Annotation) (0) | 2025.02.09 |
[Java] 데이터 타입, 자료형 (Data Type) (0) | 2025.02.09 |
[Java] 상속 (Inheritance) 과 인터페이스 (Interface) (0) | 2025.02.09 |