본문 바로가기

std::vector 소개 본문

💘 C++/행렬, 문자열, 포인터, 참조

std::vector 소개

Hyonii 2022. 7. 23. 20:28

std::vector

이전 포스팅에서 std::array를 소개했다.

std::array는 C++의 내장 고정 배열(fixed array) 기능을 더 안전하고 유용한 형태로 제공한다.

마찬가지로 C++ 표준 라이브러리에는 동적 배열(dynamic array) 작업을 더 안전하고 쉽게 해주는 std::vector를 제공한다.

An introduction to std::vector

std::vector는 자체 메모리 관리를 처리하는 동적 배열 기능을 제공한다.

즉, new와 delete를 사용하여 메모리를 동적으로 할당, 해제하지 않아도

런타임에 길이가 설정된 배열을 만들 수 있다.

std::vector는 <vector>헤더에 정의되어 있다.

 

std::vector 변수 선언은 쉽다.

 

std::array에서는 사이즈를 반드시 적어줘야 했는데 std::vector는 안적어도 된다.

초기화 하는 방법을 살펴보자

 

uniform initialization도 가능하다

std::vector는 요청에 따라 해당 내용에 대해 동적으로 메모리를 할당하기 때문에

초기화에 상관없이 컴파일 타임에 배열 길이를 명시적으로 설정할 필요가 없다.

 

위 코드를 실행시켜보면

 

사이즈가 잘 나온다.

 


 

이걸 for-each로 출력해보자
1,2,3,3,4,5 잘 나온다.

예전에는 for문에서 iterator라는 것을 사용한 적이 있었다.

iterator는 이것보다 훨씬 번거롭다. for-each가 훨씬 편하다

iterator에 대해서는 추후 설명하겠다.

 

std::vector도 std::array와 마찬가지로 배열 요소에 대한 접근은

 

 [ ] 연산자 또는 at( ) 함수를 통해 수행할 수 있다.

이 두가지의 차이는 std::array에서 설명한 것과 동일하다.

 

std::array 소개

std::array 이전 포스트들에서 고정 배열(fixed array)과 동적 배열(dynamic array)을 배웠다. 두 가지 배열 모두 C++에 내장되어 있지만, 포인터로 형 변환되었을 시 배열 길이 정보가 손실되고, 동적 배열

hyoniidaaa.tistory.com


Self-cleanup prevents memory leaks

std::vector 변수가 범위(scope)를 벗어나면 자동으로 제어하는 메모리를 할당 해제한다.

이것은 편리할 뿐만 아니라 메모리 누수를 방지하는데 유용하다.

 

이렇게 항상 new를 했으면 delete를 해줘야 했다.

 

그런데 vector는 다 쓰고 나면 블록 밖으로 나오거나 return으로 나갈 때 자동으로 사라진다.

그래서 메모리가 leak 되지 않아 아주 편리하다.

 


Vectors remember their length

가리키는 배열의 길이를 모르는 내장 동적 배열과 다르게, std::vector는 길이를 추적한다.

size() 함수를 통해 std::vector의 길이를 알 수 있다.

그래서 함수의 파라미터로 보내면 길이를 스스로 알고 있다.

 

이렇게 동적 할당할 때는 숫자 또는 변수명을 넣어서 초기화 해줄 수 있는데
그냥 my_arr 얘만 봐서는 길이가 몇인지 알 수가 없다.

그런데 std::vector는

 

size() 함수를 이용하면 지금 들어있는 원소의 개수가 몇 개 인지 알 수 있다.

 

메모리 관리를 훨씬 유용하게 사용할 수 있고

동적 메모리 할당의 장점을 충분히 활용할 수 있는 아주 좋은 기능이다.

 


Resizing an array

std::vector의 크기는 resize() 함수 호출을 통해 조절할 수 있다.

 

주목해야 할 두 가지 사항이 있다.

첫번째, 배열의 크기를 조정할 때 기존 값은 보존된다.

두 번째, 새 요소는 자료형의 기본값 (정수의 경우 0)으로 초기화된다.

그래서 1 2 3 3 4 5 0 0 0 0 이 나온 것이다.

사이즈를 마음대로 바꿀 수 있다는 것은 엄청 편하다.

 

그리고 사이즈를 줄일 수도 있다.

2로 줄여보자

 

뒤에 3 3 4 5 가 날아간 것을 볼 수 있다.

사이즈도 2만 남았다.

std::vector의 크기를 조정하는 것은 계산 비용이 많이 들기 때문에 조정 횟수를 최소화하기 위해 노력해야 한다.

 

Comments