B. 선형 자료구조
2. 배열
a. Array 생성하기
STL에서 array라는 클래스를 만들어 사용하길 권장
기본적인 틀인 버퍼, 사이즈, 용량을 작성해줌
b. 생성/소멸자 만들기
버퍼는 용량에 따라 생성
explicit은 꼭 사용하기
c. 함수 생성하기
1) 데이터 저장 : push_back 함수 생성
용량 체크하는 예외처리도 필수
2) 인덱스 값 가져오기 : operator[] 함수 생성
예외체크 assert 문법 ( #include <assert.h> 추가해야 함) 사용
d. 배열 사용하기
26번째 코드에서 에러가 나는 것 처럼, 일반 배열은 더 큰 배열로 수정할 수 없음
따라서 위와 유사하지만 다른 Vector을 사용함
e. 배열 총 코드
✨ Array.h
#pragma once
#include <assert.h>
class Array
{
using T = int;
public:
//생성자
explicit Array(int capacity = 100) : _capacity(capacity) {
_buffer = new T[capacity];
}
//소멸자
~Array() {
delete[] _buffer;
}
//데이터 저장
void push_back(const T& data) {
//용량 체크
if (_size == _capacity)
return;
//데이터 저장
_buffer[_size] = data;
//데이터 개수 증가
_size++;
}
//인덱스 값 가져오기
T& operator[](int index) {
assert(index >= 0 && index < _size);
return _buffer[index];
}
public:
int size() { return _size; }
int capacity() { return _capacity; }
private:
T* _buffer = nullptr; // buffer 데이터가 위치한 공간
int _size = 0; // size 데이터 크기
int _capacity = 0; // capacity 용량
};
✨ Maze.cpp
#include <iostream>
#include "Array.h"
int main()
{
Array arr(100);
arr.push_back(1);
arr.push_back(2);
arr.push_back(3);
arr.push_back(4);
arr.push_back(5);
arr[1] = 2;
int b = arr[1000];
}
3. 동적 배열
a. Vector
위에서 생성한 Array와 거의 비슷하지만, 동적으로 데이터를 저장하는 만큼
데이터 총량의 1.5배의 크기로 배열을 생성한다
b. 함수 수정
1) 용량 체크 : push_back 함수 수정
push_back 함수에서 용량체크를 하므로
거기서 증설작업을 하면 끝!
2) 확장 및 데이터 복사 및 기존 데이터 삭제
c. 생성/소멸자 수정
d. 함수 추가
1) 맨 뒷값 삭제 : pop_back()
2) 맨 뒷값 추출 : back()
3) 현재 데이터 모두 삭제 : clear()
capacity는 줄지않고 size만 줄음
e. 벡터 사용하기
1) 위에서 만든 코드 사용
2) 표준 벡터 사용
표준 벡터는 데이터 기능을 지정할 수 있음
(a) 사이즈와 초기값을 동시에 설정
(b) 사이즈만 설정하는 방법
💙 벡터에서 리사이즈랑 리저브에 대한 차이점
👉 size / capacity 연관성이 있음
* resize = size : 푸쉬백을 여러번 한것과 동일
* reserve = capacity : 영역을 확보
f. 벡터 총 코드
✨ Vector.h
#pragma once
#include <assert.h>
class Vector
{
using T = int;
public:
//생성자
explicit Vector() {
}
//소멸자
~Vector() {
if(_buffer) //버퍼가 있을 경우 예외처리
delete[] _buffer;
}
//데이터 저장
void push_back(const T& data) {
//용량 체크
if (_size == _capacity) {
//증설 작업
int newCapacity = static_cast<int>(_capacity * 1.5); //1.5~2배로 설정한다
//0인경우 곱해도 0이라 예외처리
if (newCapacity == _capacity)
newCapacity++;
reserve(newCapacity);
}
//데이터 저장
_buffer[_size] = data;
//데이터 개수 증가
_size++;
}
void reserve(int capacity) {
//잘못된 값이 들어온 경우 예외처리
if (_capacity >= capacity)
return;
_capacity = capacity;
//새로운 공간에 할당
T* newData = new T[_capacity];
//데이터 복사
for (int i = 0; i < _size; i++)
newData[i] = _buffer[i];
//기존 버퍼 삭제
if (_buffer)
delete[] _buffer;
//새로운 버퍼를 기존 버퍼로 인식
_buffer = newData;
}
//인덱스 값 가져오기
T& operator[](int index) {
assert(index >= 0 && index < _size);
return _buffer[index];
}
//맨 뒷값 삭제
void pop_back() {
_size--;
}
//맨 뒷값 추출
T& back() {
return _buffer[_size - 1];
}
//전체 값 삭제
void clear() {
if (_buffer) {
delete[] _buffer;
_buffer = new T[_capacity];
}
_size = 0;
}
public:
int size() { return _size; }
int capacity() { return _capacity; }
private:
T* _buffer = nullptr; // buffer 데이터가 위치한 공간
int _size = 0; // size 데이터 크기
int _capacity = 0; // capacity 용량
};
✨ Maze.cpp
#include <iostream>
#include "Vector.h"
int main()
{
Vector v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
int a = v[1];
}
'자료구조와 알고리즘 > Data Structure' 카테고리의 다른 글
[게임 프로그래머 입문 올인원] 선형 자료구조 3 : 스택 & 큐 (53강) (1) | 2024.02.15 |
---|---|
[게임 프로그래머 입문 올인원] 선형 자료구조 실습 2 : 플레이어 이동하기(51강) (0) | 2024.02.15 |
[게임 프로그래머 입문 올인원] 선형 자료구조 실습 1 : 미로 맵 만들기(50강) (0) | 2024.02.14 |
[게임 프로그래머 입문 올인원] 선형 자료구조 1 : 연결 리스트 (47강) (2) | 2024.01.23 |
[게임 프로그래머 입문 올인원] 자료구조 : 선형과 비선형 기초내용 (46강) (0) | 2024.01.23 |