STL(2)

Hi Beck·2023년 7월 27일

STL

목록 보기
2/3

3-1.vector
배열의 붙어있는 형태,사용법과 유사하긴한데 차이점으로 백터는 크기가 정해져있지않은 "무한대 배열"이란것.

내가 만약 10개인데 11개를 넣었으면 백터는 크기를 자동으로 늘려준다.
다만 아쉬운점은 배열에 비해 속도가 좀 느리다.(배열을 보강하고자 만듬)

배열은 이름과 인덱스로 관리했었는데, 백터는 클래스(백터라는 클래스)로 백터객체가 요소들(객체)을 관리한다.백터객체는 아래와 같다.

Ex)
vectorMyVector
//백터(배열)긴 한데 int형 백터(배열)이다.이렇게 백터 객체를 만듬

우리가 클래스 객체를 선언하면 눈에 보이진않지만 숨겨져있는 멤버변수와 멤버함수가 있는데 이 두개를 정의하는것은 클래스를 따라간다.(클래스:붕어빵틀,객체:붕어빵,객체 만들때마다 똑같은게 계속 생겨남)

  • 백터의구조 -> 피피티 참고

이 백터란 클래스에 대해 알아보자면

  • push_back함수
    == 배열 뒤에다가 값을 붙여준다.
    배열이 없는 상태에서 푸시백을 해서 하나의 값이 들어가는 상황에서 함수가 실행하게되면 메모리공간(네모칸)이 없으니 동적할당을 받아 한 칸을 만들고 그 값이 한 칸에 들어가게된다.for문으로 푸시백이 반복 실행돼서 또 들어가는 경우는 한 칸을 동적할당으로 받아 기존 한 칸에 붙여 두 칸을 만드는게 아니라 기존에 있던 한 칸을 딜리트하고 안에 있던 값은 복사해놓은다음 동적할당으로 두칸의 메모리공간을 새로 받고 복사했던 값은 첫째칸에 그리고 새로 푸시백한 값은 두번째 칸에 넣는다.이런식으로 반복
    -> 부족하면 새로 크게 받아오고 값들은 복사해서 붙이고 푸시백해서 넣고
    -> 백터가 메모리가 많다보니 이런 경우는 동적할당을 많이함
  • size()
    vector v1;이라고 백터 객체를 선언하고 객체 v1의 멤버함수인 size를 쓰기위해서는 v1.size()라고 쓴다.이것은 v1 안에 들어있는 원소의 갯수를 리턴해준다.(이것이 어떻게 만들어졌는지는 신경x 뭔지만 알자)

백터를 선언할때 for문으로 푸시백해서 배열에 값을 넣어주는걸 5번 돌렸다고 치면 size 했을때는 5를 반환해준다.

*벡터는 배열의 문법을 그대로 쓸 수 있어 v1[i] 이런식으로 접근할 수 있다.
이유는 얘도 동적할당 받으면서 통째로 붙어있는 메모리를 빌려오니깐 접근이 가능함

*메인에 있는 백터 객체는 스택영역에, 백터 객체 안의 멤버변수와 멤버함수는 힙영역에

3-2. vector의 멤버변수
a. 백터는 무조건 12바이트(백터 자체가 12바이트고, 무한대란건 백터가 가리키는 공간이 무한이란것이다.)

우리가 동적할당할때 주소값을 받아오기때문에 포인터로 받아오는데 이때 int형 1개를 받아오든 100개를 받아오든 포인터의 크기는 변하지않는다.그거랑 같음

b.백터는 Size, Data, Capacity라는 멤버변수 3개를 가지고있다.

Size : 백터가 저장하고 있는 현재 원소의 갯수

Data : 동적할당받은 배열의 메모리 시작 주소,얘를 포인터변수의 이름으로 보면된다.
얘를 가지고 배열이 필요할때마다 동적할당받아 가져오는것.배열 2개짜리를 받든 추가로 늘리든할때마다 동적할당으로 주소값을 계속 받아서 이 포인터 변수인 Data가 들고 있는것이다.

Capacity : 백터가 담을 수 있는 최대 원소의 갯수

3-3.또다른 백터의 활용법(반복자를 이용했을때)

vector v1;

for(int i =1; i <= 5; i++ )
v1.push_back(i);

for(auto i = v1.begin(); i != v1.end(); i++)
cout << *i << " ";

이게 이터레이터(반복자)라는건데

  • auto : i의 자료형을 알아서 써주는 자료형이라고 생각하면된다.맞춰주는 기준은 i 오른쪽의 v1.begin()이 기준이 된다.이 자리에 int형 변수를 쓰면 int로 바뀐다.) -> auto i = v1.begin();부터 i != v1.end();까지 i++하면서 돌려라
    -> 첫번째 구문은 백터의 첫번째 원소를 가리키는애가 i라는 표현한 것이고
    -> 두번째 구문은 백터의 마지막 원소가 아닐때까지 돌려라
    (여기서 end()는 끝에 위치한 메모리가 아니라 그 다음에 있는 외의 지점을 말한다.마지막 다음이여서 end함수를 리턴하면 그곳의 값이 나옴
    즉,++하면서 베열의 end 나오기 전까지 메모리들을 돈다.

*i는 i가 가리키는 곳의 원소을 의미함 거길 가서 그 원소를 찍어준다.
즉 배열의 원소를 계속 가리키는것

즉 v1안에 Data라는 포인터가 있다고하면 그 Data가 가리키는 배열이 있을것이고 v1.begin과 v1.end로 반복자(i가 반복자다.Iterator의 I)를 뜯어온다.그리고 그 반복자가지고 값에 접근할 수 있다.

반복자는 포인터 문법과 비슷하며, 객체의 멤버변수와 멤버함수에 접근할 수 있다.

3-4.vecter의 멤버함수들(인터넷 참고)
ㄱ.Iterator 관련 멤버함수
begin
첫 번째 원소를 가리키는 반복자를 리턴한다.
end
마지막 원소를 가리키는 반복자를 리턴한다.

등등

ㄴ.Capacity 관련 멤버함수
empty
원소 존재 유무를 체크한다.아무것도 없으면 true, 있으면 false를 리턴한다.
resize
백터의 크기를 변경하고 default값이나 임의의값으로 초기화한다.

등등

ㄷ.Modifiers 관련 멤버함수
clear
백터의 모든 함수를 제거한다.
Push_back
벡터의 끝에 원소를 추가한다.

3-4.백터의 사용법
-> 강의에선 인터넷의 함수들을 보면서 쓰면된다해서 이건 강의 정리가 끝난후 새로 STL을 정리할때 정리하겠다.(이론으로 x,경험으로 터득)

4.블루프린트에서 쓰는 동적배열과 백터의 차이
ㄱ.동적배열
동적 메모리 할당을 이용한 생성한 배열
c++ 공부하면서 new 연산자로 힙영역으로부터 메모리를 빌려오고 거기에 데이터를 넣으며 Delete로 반납했던 문법이 동적 배열을 쓰는 방식이다.

문법에 있던 포인터 변수(배열)로 원소들을 for문 돌면서 초기화 시키고 for문 돌면서 원소를 인자로 하는 원하는 함수를 실행시키고 마지막에 delete하는식

ㄴ.백터
c++에서 동적 배열 대신에 쓰는 크기가 변하는 컨테이너(자료구조)

  • 이전에 동적할당은 초기화 과정에서 크기를 정해줬는데 크기 정해줄 필요없다.
  • 동적배열과 비슷하게 동적할당을 하며 크기를 확장할 수 있다.
  • 백터라는 클래스 탬플릿이기에 자료형에 구애받지않고 클래스 안 여러 멤버함수를 이용할 수 있다.

5.언리얼엔진에선 백터보다 TArray라는 컨테이너 클래스를 써서 이 배열을 위주로 학습할 예정이다.

참고사이트
언리얼엔진 공식사이트(TArray: 언리얼 엔진의 배열) https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TArrays/

profile
Emotional realizer

0개의 댓글