반응형
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
반응형
그리드형
'문제풀이(Problem Solving) > C++ 문제풀이에 유용한 것들' 카테고리의 다른 글
배열로 인접행렬 vs 벡터로 인접 리스트 (0) | 2021.12.19 |
---|---|
BST 구현하기, C++ (0) | 2021.12.19 |
C++문법/ 비트 연산 및 활용(비트플래그) , <bitset> (0) | 2021.12.01 |
C++에서 STL 함수 중 유용해 보이는 것들 (0) | 2021.11.25 |
C++에서의 문자열 처리(string, regex) (0) | 2021.11.20 |