문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들

동적 크기 배열 구현하기, STL 직접 구현 (std::array)

게임이 더 좋아 2021. 12. 19. 17:28
반응형
728x170

 

배열에서 중요한 것은

배열의 크기와 해당 배열의 접근 방법이다.

때문에 생성자에서 배열의 크기와 해당 배열을 가리키는 포인터를 항상 알고 있어야 한다.

이를 염두한 채 구현해보자

#include <algorithm>
#include <iostream>

//필요한 헤더파일 포함시키고

//동적 배열 클래스를 만들어보자 (임의의 타입을 위해 템플릿 선언)
template<typename T>
class dynamic_array
{
    T* data; // 해당 배열을 가리키는 포인터 (동적할당 받음)
    size_t n; // 배열 사이즈

public:
	//배열의 크기를 인수로 받는 생성자.
    dynamic_array(int n)
    {
        this->n = n; // 이 함수를 call한 객체의 n을 설정
        data = new T[n]; // 해당 n만큼 배열 동적할당받음
    }
    //복사 생성자 (다른 객체를 인수로 받음)
    dynamic_array(const dynamic_array<T>& other) 
    {
        n = other.n;
        data = new T[n];
        
        for(int i=0; i<n; i++){
       	    data[i] = other[i];
        }
    }
    
    //실제 배열과 비슷하게 만들기 위해서 원소 접근 함수 생성
    T& operator[] (int index)
    {
        return data[index]; //해당 위치의 원소 반환
    }
    
    const T& operator[](int index) const
    {
        return data[index];
    }
    
    T& at(int index)
    {
        if(index < n) return data[index]; //범위
        
        throw "Index out of Range"; // 범위 벗어나면 에러 스로우
    }
    
    
    //배열의 크기 반환
    size_t size() const
    {
        return n;
    }
    
    ~dynamic_array()
    {
        delete[] data; //동적할당된 메모리 해제후 객체 소멸
    }
    //iterator를 이용할 수 있게 관련 함수 생성
    T* begin(){ return data;}
    const T* begin(){ return data;}
    T* end(){ return data + n;}
    const T* end(){ return data + n;} //마지막 함수의 다음 위치 반환
    
    
    // 배열을 하나로 합치는 + 연산 정의
    friend dynamic_array<T> operator+(const dynamic_array<T>& arr1, dynamic_array<T>& arr2)
    {
        dynamic_array<T> result(arr1.size() + arr2.size()); //2개 합친 크기를 동적 할당
        std::copy(arr1.begin(), arr1.end(), result.begin()); //arr1을 result의 처음부터 복사
        std::copy(arr2.begin(), arr2.end(), result.begin() + arr1.size()); //arr1의 마지막원소 뒤의 부분
        
        return result;
    }

 

 

항상 무엇인가 고려할 때는 제일 먼저

생성자를 고려한다.

그리고 필요한 연산들에 대해서 정의한다.

끝나기 전에 소멸자를 고려해야한다.

728x90
반응형
그리드형