std::vector 소개 본문
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::vector는 요청에 따라 해당 내용에 대해 동적으로 메모리를 할당하기 때문에
초기화에 상관없이 컴파일 타임에 배열 길이를 명시적으로 설정할 필요가 없다.
위 코드를 실행시켜보면
예전에는 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의 길이를 알 수 있다.
그래서 함수의 파라미터로 보내면 길이를 스스로 알고 있다.
그런데 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의 크기를 조정하는 것은 계산 비용이 많이 들기 때문에 조정 횟수를 최소화하기 위해 노력해야 한다.
'💘 C++ > 행렬, 문자열, 포인터, 참조' 카테고리의 다른 글
std::array 소개 (0) | 2022.07.23 |
---|---|
이중 포인터와 동적 다차원 배열 (Pointers to pointers and dynamic multidimensional arrays) (0) | 2022.07.22 |
보이드 포인터 (void pointer) (0) | 2022.07.21 |
For-each 반복문 (ranged-based for statement) in C++11 (2) | 2022.07.20 |
포인터와 참조의 멤버 선택 Member selection with pointers and references (0) | 2022.07.20 |