본문 바로가기
자료구조와 알고리즘

1.4 std::vector

by hyoomi 2021. 5. 18.

std::array의 단점

1. array의 size 변경 불가능 -> 원소의 삽입, 삭제 불가능

2. 항상 stack 메모리 사용

 

std::vector

가변 크기 배열

 

선언 및 초기화

//크기가 0인 벡터 선언 
std::vector<int> v0;
//크기가 3인 벡터의 원소 값 지정
std::vector<int> v1 = {1,2,3};
//모든 원소가 0으로 초기화 된, 크기가 3인 벡터 선언
std::vector<int> v2(3);
//크기가 3이고, 모든 원소가 1로 초기화된 벡터 선언
std::vector<int> v3(3, 1);

 

원소 추가

push_back(): 벡터의 맨 마지막에 새로운 원소 추가

//의사코드(pseudocode)
push_back(val):
	if size < capacity
    	마지막 원소 다음에 val 저장
        size++;
        return;
	if vector is already full
    	2*size 크기의 메모리 새로 할당
        새로 할당한 메모리로 기존 원소 전부를 복사/이동
        데이터 포인터를 새로 할당한 메모리 주소로 지정
        마지막 원소 다음에 val 저장
        size++;

첫번째 경우 시간복잡도 O(1)

두번째 경우 시간복잡도 O(n). 그러나 빈도수 낮음

push_back()의 평균 시간 복잡도 O(1)

 

 

insert(삽입할 위치를 나타내는 반복자, val): 시간 복잡도 O(n)

 

push_back()과 insert()의 단점:

추가할 원소를 먼저 임시로 생성한 후,  벡터 버퍼 내부 위치로 복사 또는 이동을 수행한다.

-> 새로운 원소가 추가될 위치에서 해당 원소를 생성하는 방식으로 최적화 가능

-> emplace_back() 혹은 emplace() 사용! : 새 원소 위치에서 곧바로 객체가 생성되기 때문에 인자에 생성된 객체를 전달하는 것이 아니라 생성자에 필요한 매개변수를 전달해야 한다.

 

 

원소 제거

pop_back() : 벡터에서 맨 마지막 원소를 제거. 벡터 크기 1 감소

시간 복잡도 O(1)

erase(): 

1. 인자가 iterator 하나일때, 해당 위치 원소 제거

2. 인자가 iterator 두개 일때, 시작부터 끝 바로 앞 원소까지 제거

O(n)

 

기타 함수

clear(): 모든 원소를 제거. 빈 벡터로 만들어준다.

reserve(capacity): 벡터에서 사용할 용량 지정. 매개변수가 현재 용량보다 클 때만 메모리를 매개변수 크기만큼 재할당한다.

shrink_to_fit(): 여분의 메모리 공간 해제. 벡터의 용량 = 벡터 크기

 

 

'자료구조와 알고리즘' 카테고리의 다른 글

1.8 deque  (0) 2021.05.23
1.7 std::list  (0) 2021.05.22
1.5 std::forward_list  (0) 2021.05.19
1.3 std:array  (0) 2021.05.17
1.2 연속된 자료구조와 연결된 자료구조  (0) 2021.05.16

댓글