C++11 : STL std::array 정적배열
배경
C++11에서 등장한 array는 기존의 정적 배열(이제는 C Style array 라고 불림)을 개선하기 위해서 등장을 했다. C/C++ 외의 다른 프로그래밍 언어를 조금 훝어보면 알 수 있다.
JAVA, JS, C# 등에서의 배열을 선언/정의 할때 부가 정보(Length 등)가 같이 있는 것에 비해서 C++11이전의 C Style static array은 단순히 연속된 메모리 공간의 앞부분을 가르키는 포인터에 불과 했었다. 이로 포인터를 사용할 경우 잘못된 메모리 참조 또는 이를 개선하기 위한 추가 코딩으로 인한 생산성 저하로 이어지는 문제가 있다.
그래서 C++11이전에서는 std::vector를 사용하기도 했다. 그러나 C Style Array에 비해서 성능 저하의 부담이 크며, 오버플로워가 일어나면, 동적으로 용량을 늘려 버리는 바람에 정해진 크기를 버퍼로 사용하기에는 잠재적인 문제가 있을 수 있다(물론 좋은 프로그래머는 이런 문제를 예방을 할 것이다).
std::array는 vector보다 경량이며, 기존의 정적 배열의 성질을 가졌으며, 반복자등 일부 STL 컨테이너를 사용할 수 있게 만들어졌다.
선언 및 초기화 방법
array표준헤더파일을 포함해야 사용할 수 있다. 타입과 배열크기를 입력하고 기존 컨테이너처럼 선언하고 사용할 수 있다. <>에 첫인자는 자료형(type), 두번째 인자는 크기를 입력해야 한다.
#include <array>
int main(const int argc, const char * argv[])
{
std::array<int, 5> arr1 = {1, 2, 3};
std::array<int, 5> arr2(1, 2, 3);
std::array<int, 5> arr3{1, 2, 3};
return 0;
}
주요 특징
정의된 array의 남는 원소에는 0으로 초기화가 된다.
array도 vector와 같이 객체명(혹은 변수명) 뒤에 대괄호로 배열처럼 사용할 수 있다.
vector처럼 반복자를 사용할 수 있다.
예시
// arrayEx.cpp
#include <array>
#include <iostream>
int main(cosnt int argc, const char * argv[])
{
std::array<int, 5> arr1{1, 2, 3};
// 네번째 int에 접근하여 값을 대입함
arr1[3] = 4;
// 반복자처럼 사용 가능
auto itArr = arr1.begin();
for(; itArr != arr1.end(); ++itArr)
{
std::cout << (*itArr) << std::endl;
}
// 출력결과 arr1[4](5번째)는 0으로 초기화 되어 있음
return 0;
}
size() 함수로 배열의 크기를 알 수 있다. 단, capacity()가 없다. 이는 vector와 가장 큰 차이 중 하나다. 이는 array경우 size()와 capacity()가 따로 있을 필요가 없기 때문이다.
array로 선언된 객체명은 array라는 컨테이너의 포인터이기이다. 이 때문에 기존의 정적 배열의 첫번째 포인터가 필요할 경우 vector와 같이 data()를 호출해서 사용해야 한다. 이는 오래된 라이브러리를 호환해야 한다던가 버퍼로 사용하기에 적절하다.
fill()로 특정 원소값으로 모든 원소를 초기화 할 수 있다.
이 밖의 자세한 특징은 cpprefernce 문서를 참조하면 된다.
참조자료
'C++' 카테고리의 다른 글
C++11 : 범위기반 for 문 (0) | 2018.03.04 |
---|---|
C++ 컴파일 에러 : cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&' (0) | 2018.01.05 |
C++ Socket : 고정 구조체 (0) | 2017.08.04 |
C++11 : 연역적 선언 auto (입문) (0) | 2017.07.03 |
C++ 패턴 : 동적 싱글턴(Dynamic Singleton) (0) | 2017.06.16 |