산업공학/자료구조

[자료구조 in C++] 정적 배열(Array)

테드리 2024. 2. 14. 20:43

배열$($Array$)$란?

배열(Array)은 자료구조의 한 형태로, 동일한 자료형의 데이터를 연속적인 메모리 공간에 순차적으로 저장하는 구조이다. 배열은 다음과 같은 특징을 가지고 있다.

  1. 고정 크기: 배열을 생성할 때, 그 크기가 정해지며, 대부분의 프로그래밍 언어에서는 배열의 크기를 변경할 수 없다
  2. 인덱스 접근: 배열의 각 요소는 인덱스(또는 위치)를 통해 접근할 수 있다. 이 인덱스는 0부터 시작하여 $($배열의 크기$)$ - 1 까지의 값을 가진다
  3. 동일한 자료형: 배열에 저장되는 모든 요소는 동일한 자료형이어야 한다. 예를 들어, 정수형 배열에는 정수만 저장할 수 있다.

 

자료구조에서의 Array

  • std::array는 메모리를 자동으로 할당하고 해제한다.
  • std::array는 원소의 타입과 배열 크기를 매개변수로 사용한다.

 

<예제 코드>

#include <iostream>
#include <array>

int main() 
{
	std::array<int, 10> arr1;
    
    arr1[0] = 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;
}

 

 

std::array는 at(index) 형식의 함수도 함께 제공한다. 만약 인자로 전달된 index 값이 유효하지 않다면 예외를 발생시킨다.

 

#include <iostream>
#include <array>

int main() 
{
	std::array<int, 4> arr3 = {1,2,3,4};
    
    std::cout<< arr3.at(3) << std::endl;  	// 에러 아님
    std::cout<< arr3.at(4) << std::endl;	// out_of_range 
}

 

 

std::array의 원소 접근 함수

함수명 설명
begin() 첫 번째 원소를 가리키는 반복자를 반환
end() 마지막 원소를 가리키는 반복자를 반환
front() 첫 번째 원소의 값을 반환
back() 마지막 원소의 값을 반환
data() 배열 객체 내부에서 포인터를 반환, 이는 배열의 첫 번째 요소를 가리킨다

 

★ begin(), end() 와 front(), back() 가 어떻게 다른 지 감이 잘 안 잡힐 수 있는데, begin(), end()는 어떤 배열에서 각각 첫번째와 마지막 원소의 반복자(iterator), 즉 "위치"를 반환하지만, front(), back()은 그 위치에 해당하는 원소 "값"을 반환한다. 따라서 만약 begin 이나 end로 원소에 접근하고자 한다면, 반드시 포인터 연산자를 수행해줘야 한다. 

 

<예제 코드 1>

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {10, 20, 30, 40, 50};
    auto it = arr.begin(); // vec의 첫 번째 요소를 가리키는 반복자

    // it 자체를 출력하려고 시도하는 경우 (컴파일러 오류 또는 의도하지 않은 출력 발생)
    std::cout << "it의 값: " << it << std::endl; // 이 줄은 컴파일되지 않거나 예상치 못한 출력을 생성합니다.

    // it를 역참조하여 첫 번째 요소의 값을 얻음
    std::cout << "첫 번째 요소의 값: " << *it << std::endl;  //첫 번째 요소인 10 출력
    
    int FirstElement = arr.front();
    std::cout << "첫 번째 요소의 값: " << FirstElement << std::endl;  //첫 번째 요소인 10 출력
}

 

<예제 코드 2>

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {10, 20, 30, 40, 50};
    
    std::cout << arr.front() << std::endl;  // 출력: 10
    std::cout << arr.back() << std::endl;   // 출력: 50
    std::cout << *(arr.data() + 1) << std::endl;  //출력: 20
}

 

※ 실제로 *(arr.begin()), arr.front, *(arr.data())는 같은 값을 출력한다

 

 

참고 문헌 

코딩 테스트를 위한 자료 구조와 알고리즘 with C++ " title="코딩 테스트를 위한 자료구조와 알고리즘 with C++" rel="noopener" data-mce-href="http:// 코딩 테스트를 위한 자료 구조와 알고리즘 with C++ ">http:// 코딩 테스트를 위한 자료 구조와 알고리즘 with C++

 

코딩 테스트를 위한 자료 구조와 알고리즘 with C++ - 예스24

67개 문제 풀이로 익히는 C++ 자료 구조와 알고리즘!코딩 테스트 준비 및 최신 C++ 문법으로 알고리즘을 학습하자!C++ 자료 구조부터 그리디 알고리즘, 분할 정복 알고리즘, 그래프 알고리즘, 동적

www.yes24.com