자료구조와 알고리즘/Data Structure

[게임 프로그래머 입문 올인원] 선형 자료구조 2 : 동적배열 (48강)

순정법사 2024.01.23

B. 선형 자료구조

2. 배열

a. Array 생성하기

STL에서 array라는 클래스를 만들어 사용하길 권장

 

Array 클래스 생성 후 Array.h에 작성

 

기본적인 틀인 버퍼, 사이즈, 용량을 작성해줌

 

b. 생성/소멸자 만들기

버퍼는 용량에 따라 생성

explicit은 꼭 사용하기

 

 

c. 함수 생성하기

1) 데이터 저장 : push_back 함수 생성

 

용량 체크하는 예외처리도 필수 

 

 

2) 인덱스 값 가져오기 : operator[] 함수 생성

 

예외체크 assert 문법 ( #include <assert.h> 추가해야 함) 사용

 

가져온 값을
이렇게 수정할 수 있음

 

d. 배열 사용하기

위와 같이 사용할 수 있음

 

int b = arr[1000];에서 에러

 

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. 생성/소멸자 수정

증설작업이 있으니 값을 받지 않아도 됨 /&nbsp; if문 추가

 

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];
}

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com