C++

2024.02.29 - vector

강병곤 2024. 3. 3. 21:19
  • vector

vector는 자동으로 메모리가 할당되는 배열이라고 할 수 있다. 배열은 생성시 크기를 정해주어야 하고 그 크기가 가변적이지 않지만, vector는 배열과 비슷하지만 크기가 자동으로 늘어날 수 있다. 다만 속도적인 측면에서 배열에 비해 떨어진다는 단점이 있다. 

 

  • vector의 사용

vector를 사용하기 위해서는 <vector> 헤더파일을 추가해야한다. vector의 선언은 아래와 같이 이루어진다.

std::vector<데이터타입> 변수이름;

vector는 표준 라이브러리에 있는 클래스이므로 범위 지정 연산자로 std에서 왔음을 밝혀야한다. 

 

  • vector를 생성하는 다양한 예제
#include<vector>

int main() {
    //1. 비어있는 vector 생성
    std::vector<int> vec1;

    //2. 기본값이 0으로 초기화된 요소 5개를 가지는 vector 생성
    std::vector<int> vec2(5);

    //3. 기본값이 2로 초기화된 요소 5개를 가지는 vector 생성
    std::vector<int> vec3(5, 2);

    //4. vec3를 복사하여 vec4 생성
    std::vector<int> vec4(vec3);

    //5. 벡터 생성후 1, 2, 3 으로 초기화 (요소 3개를 가짐)
    std::vector<int> vec5 = { 1,2,3 };
}

 

 

  • vector의 값 참조하는 여러가지 방법
#include<iostream>
#include<vector>

int main() {
    std::vector<int> vec5 = { 1,2,3,4,5 };

    //1. 배열 처럼 vec5[인덱스]로 참조하기
    std::cout << vec5[1] << std::endl;

    //2. vector의 멤버 함수 .at(인덱스)로 참조하기
    std::cout << vec5.at(2) << std::endl;

    //3. vector의 멤버 함수 .front()로 첫번째 요소 참조하기
    std::cout << vec5.front() << std::endl;

    //4. vector의 멤버 함수 .back()으로 마지막 요소 참조하기
    std::cout << vec5.back() << std::endl;
}

 

 

  • push_back(), pop_back()

vector의 마지막 요소를 추가하거나 제거할 수 있다.

#include<iostream>
#include<vector>

int main() {
    std::vector<int> vec5 = { 1,2,3,4,5 };

    //vec5의 마지막 요소로 6을 추가한다.
    vec5.push_back(6);
    std::cout << vec5.back() << std::endl;

    //vec5의 마지막 요소를 제거한다.
    vec5.pop_back();
    vec5.pop_back();
    std::cout << vec5.back() << std::endl;
}

 

 

  • vector의 size와 capacity

vector의 멤버 함수 size()는 vector의 원소의 개수를 리턴한다. capacity()는 vector에 할당된 공간의 크기를 리턴한다.

 

#include<iostream>
#include<vector>

int main() {
    std::vector<int> vec5 = { 1,2,3,4,5 };
    std::cout << vec5.size() << std::endl;
    std::cout << vec5.capacity() << std::endl;
}

 

얼핏 size와 capacity는 다른 것 같지 않아 보인다. 그러나 vector의 원소의 갯수를 늘려보면 차이가 있음을 알 수 있다.

 

#include<iostream>
#include<vector>

int main() {
    std::vector<int> vec5 = { 1,2,3,4,5 };
    vec5.push_back(6);
    std::cout << "size : " << vec5.size() << std::endl;
    std::cout << "capavity : " << vec5.capacity() << std::endl;
    std::cout << "=======" << std::endl;

    vec5.push_back(7);
    std::cout << "size : " << vec5.size() << std::endl;
    std::cout << "capavity : " << vec5.capacity() << std::endl;
    std::cout << "=======" << std::endl;

    vec5.push_back(8);
    std::cout << "size : " << vec5.size() << std::endl;
    std::cout << "capavity : " << vec5.capacity() << std::endl;
    std::cout << "=======" << std::endl;
}

 

요소의 개수가 늘어날 때마다 메모리가 증가하는 것이 아니라, 한번 메모리가 늘어날 때 미리 공간을 어느정도 할당해 놓는 것을 알 수 있다. push_back이 일어날 때마다 동적할당을 하면 비효율적이므로 미리 정해둔 만큼 동적할당을 한번에 하는 것이다.