본문 바로가기
프로그래밍 언어/C++

[C++] [STL] Vector 사용 방법

by 까망 하르방 2021. 7. 26.
반응형

동적으로 원소를 추가하고 크기를 자동으로 늘려주는 Vector

C++ 표준 라이브러리(STL) 중 하나이다. → #include <vector>

- front() : 첫 번째 원소
- back() : 마지막 원소
- begin() : 첫번째 위치
- end() : 마지막의 다음 위치
- size() : 원소 개수
- capacity() : 할당된 공간 크기
- push_back(value) : vector 끝에 원소 삽입
- pop_back() : 끝에 있는 원소 삭제
- insert(index, value) : index 위치에 원소 삽입
- erase(iter) : vector의 iter 위치의 원소 삭제
- erase(iter1, iter 2) : [iter 1, iter 2) 앞 까지 원소 삭제 
- resize(size), resize(size, value) : size 만큼 크기 변경하거나 동시에 초기화
- clear() : 모든 원소 삭제
- empty(): 비어있는지 확인합니다. (true / false)
#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
    vector<int> v;

    v.push_back(3); v.push_back(4);
    v.push_back(5); v.push_back(6);
    v.push_back(7);

    cout << v[0] << endl; // 3
    cout << v.size() << endl; // 5
    cout << v.capacity() << endl; // 6

    v.erase(v.begin()); // [0]번째 원소 3 제거
    v.erase(v.begin() + 1, v.begin() + 2); // [1]번째 원소 5 제거

    for (int i = 0; i < v.size(); i++) {
        cout << v.at(i) << " ";
    }
    cout << endl;
}

 

특징

- 가변적으로 크기가 변하는 배열이라고 볼 수 있다.

- 속도적인 측면에서는 배열에 비해 떨어지더라도 메모리 측면에서는 효율적인 관리 가능

- 한 메모리 블록에 연속하게 저장

   → 메모리 재할당에 따른 부하 발생 有

- 중간 삽입/삭제가 빈번한 경우에는 vector 구조다 링크드리스트 구조를 사용하느 것이 효율적.

반복자 iterator도 사용 가능

- vector에는 .at(index)처럼 [index] 처럼 

  index번째 원소에 접근하는 것은 동일하다.

  다만 at(index)은 범위를 검사하여 범위 밖 원소 접근시 예외처리 (std::out_of_range)

  [](operator [])는 범위검사가 없기에 예외처리 발생 X

  이처럼 vector는 다양한 선언방법과 메소드 용도가 존재한다.

 

Q) size와 capacity 차이와 용도가 무엇인가요?

capacity가 들어갈 수 있는 총 용량이라고 하면, size는 현재 들어가 있는 개수

- size() : 원소 개수

- capacity() : 할당된 공간 크기

ex) 10개(=capacity) 중에 3개(=size)

→ vector는 일정 capacity 만큼의 메모리가 할당되는데 원소가 새롭게 삽입될 때마다

    추가적인 메모리 할당이 필요하다.

    이때, capacity (= 용량)가 부족한 경우 {capacity/2} 만큼 capacity를 늘린다.

 

반응형

댓글