C++ Chapter 6.19 : std::array 정적 배열 편리하게 사용하기

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


정적 배열

  • 컴파일 타임에 배열의 크기가 미리 정해져 있는.
  • 프로그램 실행 전 미리 배열의 크기만큼 스택 메모리로부터 메모리를 할당 받는다.
  • 따라서 배열의 크기 지정이 필수


std::array

  • #include <array>
  • 정적 배열을 std::array로 선언하면 배열을 다룰 때 편리할 여러 함수들을 사용할 수 있다.
  • 동적 배열과 달리 배열의 크기가 컴파일 타임에 결정될 수 있도록 반드시 써주어야 한다. 변수 사용 불가. 상수나 리터럴만 가능

다른 배열로 값을 바꿀 수 있다.

std::array <int, 5> my_arr = {1, 2, 3, 4, 5};
int array [5] = {1, 2, 3, 4, 5};

array = {2, 3, 4, 5, 6}; // ❌ 불가능.
my_arr = {2, 3, 4, 5, 6}; // ⭕ 가능

array = {2, 3, 4, 5, 6}; -> ❌ 불가능.

  • 정적 배열은 한번 초기화 되면 다른 것으로 초기화 할 수 없다.
  • 배열 이름 주소값을 바꿀 수 없음

my_arr = {2, 3, 4, 5, 6}; -> ⭕가능

  • std::array로 선언된 정적 배열은 다른 배열로 초기화 할 수 있다.

파라미터로 std::array를 보낼 때 원래 성질이 그대로 유지된다.

void printLength(array<int,5> my_arr) { ... }
void printLength(const array<int,5> & my_arr) { ... }

int main()
{
    array<int,5> my_arr = {1, 2, 3, 4, 5};

    printLength(my_arr);
}
  • 일반 정적 배열을 매개변수 타입으로 정하는 것은 금지되어 있다. 참고
  • 그러나 std::array인 정적 배열은 매개변수 타입이 될 수 있다.
  • 그러므로 printLength(my_arr); 이렇게 배열을 넘겨서 array<int,5> my_arr 매개변수로 받으면 배열 내용을 전부 복사 하게 되어 시간이 오래 걸린다. (call by value)
  • 따라서 매개변수 타입을 참조 혹은 const 참조로 하여 복사할일 없이 std::array 정적 배열을 참조할 수 있도록 하는 것이 성능면에서 좋다.
    void printLength(const array<int,5> & my_arr)
    

for-each 에도 돌릴 수 있다

for (auto & element : my_arr){ ... }


함수

at(i)

std::array <int, 5> my_arr = {1, 2, 3, 4, 5};
my_arr.at(3);
  • std::array로 선언된 배열의 i번째 인덱스에 위치한 원소를 리턴한다.
  • my_arr[i]와 같다.
    • 다른 점은 at을 쓰면 over index시 예외처리를 해준다는 것이다.
    • 다만 예외처리를 해주니 조금 더 느리겠죠!

size()

std::array <int, 5> my_arr = {1, 2, 3, 4, 5};
my_arr.size();
  • std::array로 선언된 배열의 원소 개수 리턴

정렬

std::array <int, 5> my_arr = {1, 2, 3, 4, 5};
std::sort(my_arr.begin(), my_arr.end());
  • begin() : std::arry 배열 원소의 첫번째 위치
  • end() : std::arry 배열 원소의 마지막 위치
  • std::sort 는 #include <algorithm> 하면 사용할 수 있는데 begin()end()를 이용하여 std::array 정적 배열을 정렬할 수 있다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기