그냥 게임개발자

C++ - vector 본문

내 개인적인 공부/자료구조

C++ - vector

sudoju 2024. 4. 13. 13:11

vector는 동적으로 요소를 할당할 수 있는 동적 배열이에요

이게 무슨 말이냐면

배열같은 경우는 정적배열이에요

 

아래와 같은 경우가 정적배열입니다.

    int[5] arr;

이로써 컴파일 시점에 5라는 크기를 가진 배열이 생성되는 건데 이 이상은 추가를 못합니다.

 

확인해봅시다.

 

#include <iostream>

using namespace std;

int main()
{
    int arr[5];
    
    for (int i = 0 ; i < 6; ++i)
        arr[i] = i + 1;
}

 

위 코드와 같이 5개의 크기를 가진 배열에 6번을 돌려서 값을 초기화 해봅시다.

 

 

보시면

Run-Time Check Failure #2 - Stack around the vraialbe 'arr' was corrupted.

라는 에러가 뜹니다.

 

구글 갓

arr 주변의 스택이 손상이 되었다고 뜹니다.

당연하죠 우리는 5개의 크기를 가진 배열밖에 선언을 안했는데

6번째 방이 생성이 되지도 않았는데 우리는 6번째에 접근 하려니 메모리 스택부분에서 이상한 주소값을 건드리게 되는 겁니다.

 

arr[5]는 공간이 할당이 되지도 않았는데 접근하려니 컴퓨터가 황당한거임

 

그렇다면 이 상황을 어떻게 해결해야 할까..?

뭐 간단하게 생각하면 다시 배열의 크기를 초기화 시켜줘야 하지만,

이는 되게 코드도 더러워지고 번거롭게 매번 초기화를 시켜줘야 하는 상황이 나올겁니다.

 

이를 해결할 방안은 동적배열을 사용하는겁니다.

 

vector는 capcity() 메모리의 크기를 미리 설정하고 그 용량을 넘어가게 되면 새로운 메모리 크기를 다시 할당해주는 컨테이너입니다.

 

capcity 생산 능력

엥 size라는 함수가 있어서 그게 크기 아닌가?

라는 사람도 있을수 있을꺼에요

저만 처음 배울 때 그랬나요..?

아무튼

capacity는 위에 번역사진처럼 생산 능력, 수용력 즉 벡터의 요소들을 담을 수 있는 메모리를 미리 할당해주는 용량이고

size는 실제 벡터에 담긴 요소들의 개수를 반환하는 함수입니다.

 

이걸보면서 이야기 하는게 더 쉬울 것 같은데요

vector에 담긴 요소들은 { 1, 3, 7, 4, 5 }입니다.

근데 이 vector의 실제 메모리 공간은 

8개의 공간이 할당이 되어있습니다.

그래서 capacity는 8이며

size는 5개입니다.

 

vector는 숫자 인덱스를 기반으로 접근이 가능하고 중복 값 또한 허용합니다.

vector는 탐색과 맨 뒤의 요소를 삭제하거나 삽입하는데 시간복잡도는 O(1)이 걸립니다.

굉장히 빠르죠.

하지만 맨 뒤, 맨 앞이 아닌 중간요소를 삭제하고 삽입하는데는 O(n)의 시간이 걸려요.

 

문법은 이렇습니다.

vector<Type> VariableName;

Type = int, double, 등 여러 타입을 씁니다.

VariableName은 변수명이겠죠.

 

그러면 간단하게 하나 해보고 다음에는 vector가 사용할 수 있는 함수들에 대해서 공부해보죠.

 

#include <iostream>
#include <vector>

using namespace std;

vector<int> vec;

int main()
{
    for (int i = 1; i <= 10; ++i)
        vec.push_back(i);
        
    for (int entity : vec)
        cout << entity << " ";
        
    cout << '\n';
    vec.pop_back();
    
    for (int entity : vec)
        cout << entity << " ";
        
    vec.erase(vec.begin(), vec.begin() + 3);
    
    for (int entity : vec)
        cout << entity << " ";
        
    cout << '\n';
    
    vector<int>::iterator findIt = find(vec.begin(), vec.end(), 100);
    
    if (findIt == vec.end())
        cout << "Not Found It" << '\n';
        
    fill(vec.begin(), vec.end(), 10);
    
    for (int entity : vec)
        cout << entity << " ";
        
    cout << '\n';
    
    vec.clear();
    
    cout << "vector를 클리어했는지 확인\n";
    
    for (int entity : vec)
        cout << entity << " ";
        
    cout << '\n';
    
    return 0;
}

 

와 기네요...

 

아 여기서 vector<int>::itreator이 부분은 auto로 해도 무방해요 저는 그냥 무엇을 반환하는지 확실히 알고 싶어서 이렇게 적습니다.

 

물론 너무 길어지고 이미 알고있는 반환 형태라면 auto를 쓰는데 지금은 복습이자 배우고 있으니까요 하하

 

이거는 직접 써보고 어떤 결과가 나오는지 확인해보세요

 

저랑 똑같이 나왔다면 맞고 그리고 자기가 컴퓨터가 된다고 생각하면서 이렇게 나타낼꺼다 예상하고 적어보세요.

저는 맞았음

 

 

이제 다음 포스팅에서 함수 공부하러 가봐요

헥헥

'내 개인적인 공부 > 자료구조' 카테고리의 다른 글

vector를 통해서 2차원 배열 만들기  (0) 2024.04.13
vector의 정적할당?  (0) 2024.04.13
for in range  (0) 2024.04.13
[C++] vector - 함수들  (0) 2024.04.13
자료구조란?  (0) 2024.04.12