배열은 한 번 크기가 정해지면 동적으로 변경되지 않습니다.
동적으로 크기를 변경하려면 벡터 등의 STL 컨테이너를 활용하면 됩니다.
배열을 STL 컨테이너 형태로 사용하는 것이 바로 std::array입니다.
동적인 할당과 해제가 없어서 성능상 이점이 있는 배열을 편리한 사용을 할 수 있도록 해줍니다.
std::array는 <array> 헤더를 포함한 이후에 사용이 가능합니다.
기본적인 std::array의 사용 방법은 다음과 같습니다.
#include <array> #include <iostream> int main() { // initialization std::array<int, 5> data = {0, 1, 2, 3, 4}; // get size std::cout << "Size: " << data.size() << std::endl; // iterator for (auto it = data.cbegin(); it != data.cend(); ++it) { std::cout << *it << " "; } std::cout << std::endl; // get an address of first element std::cout << *data.data() << std::endl; // C-style array and at() method access std::cout << data[1] << " " << data.at(2) << std::endl; // get first element std::cout << "First value: " << data.front() << std::endl; // get last element std::cout << "Last value: " << data.back() << std::endl; // assign() method data.assign(5); for (auto elem : data) { std::cout << elem << " "; } std::cout << std::endl; // fill() method data.fill(6); for (auto elem : data) { std::cout << elem << " "; } std::cout << std::endl; return 0; }
다른 STL의 컨테이너와 동일하게 반복을 위한 begin(), end() 형태의 메소드가 제공됩니다.
첫 원소나 마지막 원소를 가져오기 위해 front(), back() 메소드를 사용할 수 있습니다.
그리고 크기를 확인할 수 있는 size() 메소드 역시 존재합니다.
배열의 원소의 수를 얻기 위해서 _countof 등을 사용하지 않아도 됩니다.
첫 번째 원소의 주소를 반환하는 data() 메소드가 존재합니다.
기존 배열에서는 배열의 이름이 첫 원소의 주소를 나타냈는데 std::array는 직접 사용이 불가능합니다.
#include <array> #include <iostream> int main() { int normal[5] = { 0, 1, 2, 3, 4 }; int* first = normal; std::cout << *first << std::endl; // initialization std::array<int, 5> data = {0, 1, 2, 3, 4}; // first = data; // error first = data.data(); std::cout << *first << std::endl; return 0; }
주석 처리된 부분을 해제하면 컴파일 에러가 발생합니다.
또 다른 특징으로는 'Derived-to-base' 형변환을 지원하지 않는다는 점입니다.
#include <array> #include <iostream> class Base { virtual void print() { std::cout << "Base" << std::endl; } }; class Derived : public Base { virtual void print() { std::cout << "Derived" << std::endl; } }; void foo(std::array<Base, 5> arr) { // do something } int main() { std::array<Derived, 5> data; foo(data); return 0; }
부모 클래스의 std::array를 받는 함수를 자식 클래스 타입의 std::array로 호출할 수 없습니다.
std::array는 일반적인 배열과 같이 [] 등의 인덱스 기반으로도 사용이 가능합니다.
STL 컨테이너이므로 코드의 일관성을 유지할 수 있습니다.
메소드들을 활용해서 좀 더 안정적으로 코드를 작성할 수도 있습니다.
최근에는 대부분 환경이 C++11을 지원하기 때문에 배열 대신 std::array를 사용하는 것을 추천합니다.
'Programming > CPP11&14' 카테고리의 다른 글
[C++11] 가중치를 적용해서 랜덤 넘버(Random Number) 생성 (0) | 2017.01.05 |
---|---|
[C++11] 초기화자 리스트(initializer list)와 std::initializer_list (0) | 2016.12.25 |
[C++11] Storage class specifiers에 thread_local 추가 (0) | 2015.07.07 |
[C++11] std::mutex를 통한 thread 동기화 (0) | 2015.06.29 |
[C++11] thread 지원 - future를 통한 return값 획득 (2) (0) | 2015.06.28 |