[2023 동계 모각소] 2주차

hyeona·2024년 1월 20일

2023 동계 모각소

목록 보기
2/6
post-thumbnail

📌 std::array

: 원소의 타입과 배열 크기를 매개변수로 사용하는 클래스 템플릿
: C 스타일 배열에 대한 래퍼 클래스

1. 메모리 자동 할당/해제

: 메모리를 자동으로 할당하고 해제함

<예제 코드>

: 크기가 10인 int 타입의 std::array 배열을 선언한 후, 원소 값을 설정하거나 화면에 출력 하는 예제 코드

std::array<int, 10> arr; //크기가 10인 int 타입 배열 선언

arr1[0] = 1; //첫 번째 원소를 1로 설정
std::cout << "arr1 배열의 첫 번째 원소: " << arr1[0] << std::endl;

std::array<int, 4> arr2 = {1, 2, 3, 4};
std::cout << "arr2의 모든 원소: ";

for (int i = 0; i < arr2.size(); i++)
   std::cout << arr2[i] << " ";
std:: cout << std::endl;

이 예제 코드를 실행하면 다음과 같이 출력된다.

  • arr1 배열의 첫 번째 원소: 1
    arr2의 모든 원소: 1 2 3 4



2. [ ] 연산자

  • C 스타일 배열과 똑같은 방식으로 배열 원소에 접근할 수 있는 [] 연산자를 제공한다.
  • [] 연산자에 접근하고자 하는 배열 원소 인덱스(index)을 지정할 경우, 빠른 동작을 위해 전달된 인덱스 값이 배열의 크기보다 작은지를 검사하지 않는다.
    -> 대신 std::array는 at(index) 형식의 함수도 함께 제공한다.

✔️ at(index)

  • 인자로 전달된 index 값이 유효하지 않으면 std::out_of_range 예외(exception)를 발생시킨다.
    -> at() 함수가 [] 연산자보다 조금 느린 편이지만, at() 함수를 잘 이용하면 예외를 적절하게 처리할 수 있다.

<예제 코드>

: 배열 인덱스를 사용자 입력으로 받는다든가, 또는 다른 이유로 인해 유효하지 않은 인덱스에 접근할 수 있는 상황이라면 다음과 같은 예외 처리 코드를 만들 수 있다.

std::array<int, 4> arr3 = {1, 2, 3, 4};

try
{
   std::cout << arr3.at(3) << std::endl; //에러 아님
   std::cout << arr3.at(4) << std::endl; //std::out_of_range 예외 발생
}
catch (const std::out_of_range& ex)
{
   std::cerr << ex.what() << std::endl;
}



3. 객체 전달 방식

: std::array 객체를 다른 함수에 전달하는 방식은 기본 데이터 타입을 전달하는 것과 유사하다.

  • 값 또는 참조(reference)로 전달할 수 있고, const를 함께 사용할 수도 있다.
  • C 스타일 배열을 함수에 전달할 때처럼 포인터 연산을 사용한다거나 참조 또는 역참조(de-reference) 연산을 하지 않아도 된다.
    -> 다차원 배열을 전달하는 경우에도 std::array를 사용하는 것이 가독성이 훨씬 좋다.

<예제 코드>

: 사용자 정의 함수 print()에 std::array 배열을 값으로 전달하는 예제 코드

void print(std::array<int, 5> arr)
{
   for (auto ele : arr)
      std::cout << ele << ", ";
}

std::array<int, 5> arr = {1, 2, 3, 4, 5};
print(arr);

이 예제 코드를 실행하면 다음과 같이 출력된다.

  • 1, 2, 3, 4, 5,



📌 백준 문제 풀이

0개의 댓글