Nagie's DevStory

[STL] 02. std::vector 본문

Programming/STL

[STL] 02. std::vector

Nagie 2023. 10. 25. 22:44
728x90

std::vector는 C++ 표준 라이브러리(STL)에서 제공하는 가변 크기 컨테이너다.

C++ 11 표준부터 사용할 수 있고 <vector> 헤더에 정의되어 있다.

 

특징

 

1. 동적 크기 조절 : 벡터는 동적으로 크기를 조절할 수 있다. 초기 크기를 정의한 후에도 요소를 추가하거나 삭제할 수 있어

메모리의 효율적인 사용과 크기 조절이 필요한 상황에 유리하다.

 

2. 빠른 임의 접근 : 벡터는 근본적으로 동적 메모리기 때문에 배열처럼 인덱스를 사용하여 빠르게 접근할 수 있다.

마찬가지로 인덱스를 알고 있다면 해당 요소에 접근하는 시간은 O(1)이다.

 

3. 메모리 관리 : 벡터는 요소를 메모리에서 연속적으로 저장하므로 메모리의 효율적인 사용이 가능하다.

 

4. std::vector의 크기 및 용량 : 벡터는 현재 크기(Size)와 용량(Capacity)을 추적한다.

크기는 벡터에 실제로 저장된 요소의 수이며 용량은 내부적으로 할당된 메모리의 크기를 나타낸다.

만약 벡터의 크기(Size)가 용량(Capacity)을 초과하면 자동으로 메모리를 늘려준다.

(늘리는 용량은 현재 용량의 2배를 통상적으로 늘린다.)

 

 

사용법

 

기본적인 사용법은 다음과 같다.

#include <iostream>
#include <vector>

int main() {

	std::vector<int> v1;
	std::vector<int> v2(10);
	// int 값을 저장할 비어 있는 벡터 생성
	// int 값 10개를 저장할 벡터 생성하고 0으로 초기화

	std::vector<int> v3(10, 1); // int 값 10개를 저장할 벡터 생성하고 1로 초기화
	std::vector<int> v4{ 10, 20, 30, 40, 50 }; // 유니폼 초기화(uniform initialization)
	std::vector<int> v5(v4);

	// v4를 복사하여 v5 생성
	std::vector<int> v6(v4.begin(), v4.begin() + 3); // v4의 처음 3개 원소를 이용하여 v6 생성
}

 

2차원 벡터를 생성하고 싶다면 다음 코드처럼 작성하면 된다.

 

#include <iostream>
#include <vector>

int main() {

	std::vector<std::vector<int>> v1; //2차원 벡터 (초기화 X)

	std::vector<std::vector<int>> v2(2, std::vector<int>(3, 0)); // 2x3 크기의 메모리 공간을 0으로 초기화
	
	std::vector<std::vector<int>> v3 { 
		{1, 2, 3},
		{4, 5, 6} 
	};
}

 

3차원 벡터도 다음과 같이 생성할 수 있다.

 

#include <iostream>
#include <vector>

int main() {

	std::vector<std::vector<std::vector<int>>> v1;
}

 

그런데 3차원까지 사용할 정도면 그냥 다른 자료구조를 사용하는 게 더 좋다.

이유는 std::vector 역시 배열이기 때문에 같은 단점을 가지고 있으며

기존의 다차원 배열처럼 데이터 관리가 힘들기 때문이다.

 

요소에 접근하는 방법은 기존의 배열처럼 [](첨자 연산자)를 사용해 접근이 가능하며

at()을 통해 접근도 가능하지만 대체로 첨자 연산자를 더 선호한다.

 

 

벡터의 주요 멤버 함수와 기능

 

멤버 함수 설명 시간 복잡도
operator[]
특정 위치 원소의 참조를 반환

O(1)
front()
첫 번째 원소의 참조를 반환

O(1)
back()
마지막 원소의 참조를 반환

O(1)
push_back()
마지막에 원소를 추가

O(1)
emplace_back()
push_back()과 동일

다만 객체의 복제나 이동이 없어서 효율적임

O(1)
pop_back()
마지막 원소를 삭제

(마지막 원소 반환 X)

O(1)
insert()
특정 위치에 원소를 삽입

O(N)
erase()
특정 위치의 원소를 삭제

O(N)
clear()
모든 원소를 삭제

O(1)

size()

원소의 개수를 반환 O(1)
empty()
벡터가 비어 있으면 true를 반환

O(1)

 

 

728x90
Comments