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

[게임 프로그래머 입문 올인원] STL Container : vector와 iterator (65, 66강)

순정법사 2024.02.21

A. vector

강의 내용이 너무 뒤죽박죽이여서 목차를 잡을 수 없음

강사님의 질문과 대답이 다른 경우가 많아;; 강의 흐름대로 목차를 잡음

 

1. vector의 기본기 (복습)

위 사항들은 기본으로 알아야 함

 

a. size와 capacity의 차이점

🌟 실제 사용하는 공간 / 할당된 공간

reserve를 먼저 사용하는 이유? ➡ 이사비용, 메모리 파편을 아낌

 

<size와 clear가 실행된다면>

 

0, 5값으로 나옴

 

capacity까지 줄이고 싶다면 빈 벡터로 스왑 

: 사용 안함(이론적인 것)

 

또르르..

 

b. 데이터 삽입, 추출, 임의 접근의 시간복잡도

push_back() : 가장 고전적으로 데이터를 삽입하는 방법

 

🧡 시간복잡도

- 시작 : O(n) 
- 중간 : O(n) 
- 끝 : O(1) 

- 첫 데이터 가져오기 front() : O(1) 
- 마지막 데이터 가져오기 back() : O(1) 

- 임의 접근 O(1)  

 

c. 변수와 조건식의 관계

변수를 사용하면 반복해서 조건식을 계산하지 않아도 됨

 

d. 벡터 초기화 방법

초기화방법 3가지

 

e. 벡터의 복사

v2는 복사가 일어나서 v2값만 수정됨
복사가 싫다면 주소값 넘기기

 

 


B. vector의 iterator

1. iterator의 기본기  

반복자 이해의 기본

 

데이터 위치는 상수를 더해서 옮길 수 있음

 

a. 데이터 순회

1) 포인터 사용

 

모든 데이터를 출력하기

 

2) 반복자 클래스 사용

 

1. 벡터의 시작과 끝 지정
2. 모든 데이터 출력 / 반복문은 왼쪽과 오른쪽이 동일함

 

🧡 포인터 사용하지 않고 반복자 클래스를 사용하는 이유

자료구조는 나중에라도 바뀔수 있지만
인터페이스를 기본적으로 다 동일하게 만들어서 동일한 코드가 유지될 수 있게 하는 것

 

b. 데이터 검색

가장 기본적인 방식

 

c. 데이터 삭제

 

erase() 함수를 이용

배열크기도 바뀐다!

 

❌ 잘못된 몬스터 삭제 코드

아래 코드 설명

0) 1부터 5까지 있는 vector 
1) 기본 순회 코드: 짝수일때 제거하기
2) 다시 순회 후 값 출력

위 코드는
바로 크러쉬


🤦‍♂️ 이유는 erase()의 행동때문에 그럼

삭제를 한 후 데이터의 위치가 앞당겨지는데 (3)
it++되면서 또 그 다음 위치(4)가 됨


👉 따라서 이렇게 erase 된 객체를 it으로 받아줘야 하고, 
증감문을 따로 넣어줘야 한다

💥 위와같이 실시간으로 스캔하면서 무언가를 추가/삭제하는 코드는 지양하는게 좋음

 

 

2. 순회 코드 알아보기 (벡터 기반)

 

반복자는 위 그림과 같은 내용만 구현하면 됨

 

a. 클래스로 반복자 생성하기

원래 사용하던 Vector 코드에 직접 반복자 생성하기

 

Iterator를 따로 빼서 생성 (넣어도 상관 X)
<T> 넣어주기

 

아래와 같이 사용 가능

 

이와같이 iterator은 container에 있는 클래스임

 

b. 반복자의 특성 구현하기

생성자 / 데이터 삽입 / 전위형 ++ / 후위형 ++ / 다음 데이터 넘어가기 / 등위비교 /  데이터 가져오기       

 

 c. 벡터 코드 수정하기

벡터 코드에 Begin, End를 제공하게 구현하기 

 

 

d. 반복자 사용하기

든든~

 

 

 


출처 : 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