std::vector
이전 포스트에서 std::array
를 소개했다. std::array
는 C++의 내장 고정 배열(fixed array) 기능을 더 안전하고 유용한 형태로 제공한다.
마찬가지로 C++ 표준 라이브러리에는 동적 배열(dynamic array) 작업을 더 안전하고 쉽게 해주는 std::vector
를 제공한다.
An introduction to std::vector
C++ 03에서 소개된 std::vector
는 자체 메모리 관리를 처리하는 동적 배열 기능을 제공한다. 즉, new와 delete를 사용하여 메모리를 동적으로 할당∙해제하지 않고도 런타임에 길이가 설정된 배열을 만들 수 있다∙ std :: vector는 <vector>
헤더에 정의되어 있다.
std::vector
변수 선언은 쉽다.
#include <vector>
// no need to specify length at initialization
std::vector<int> array;
std::vector<int> array2 = { 9, 7, 5, 3, 1 }; // use initializer list to initialize array
std::vector<int> array3 { 9, 7, 5, 3, 1 }; // use uniform initialization to initialize array (C++11 onward)
std::vector는 요청에 따라 해당 내용에 대해 동적으로 메모리를 할당하기 때문에 초기화에 상관없이 컴파일 타임에 배열 길이를 명시적으로 설정할 필요가 없다.
std::array와 마찬가지로, 배열 요소에 대한 접근은 []
연산자 또는 at()
함수를 통해 수행할 수 있다.
array[6] = 2; // no bounds checking
array.at(7) = 3; // does bounds checking
위 예제에서 두 경우 모두 배열의 끝 부분에 있는 요소를 요청하면 벡터 크기가 자동으로 조정되지 않는다.
C++ 11에서는 다음과 같이 초기화 리스트(initializer-list)를 사용해 std::vector에 값을 할당할 수 있다.
array = { 0, 1, 2, 3, 4 }; // okay, array length is now 5
array = { 9, 8, 7 }; // okay, array length is now 3
이 경우 std::vector는 제공된 요소 수와 일치하도록 크기가 자동으로 조정된다.
Self-cleanup prevents memory leaks
std::vector 변수가 범위(scope)를 벗어나면 자동으로 제어하는 메모리를 할당 해제한다. 이것은 편리할 뿐만 아니라 메모리 누수를 방지하는 데 유용하다.
void doSomething(bool earlyExit)
{
int* array = new int[5] { 9, 7, 5, 3, 1 };
if (earlyExit)
return;
// do stuff here
delete[] array; // never called
}
earlyExit를 true로 설정하면 배열의 할당이 해제되지 않고 메모리가 누수 된다.
그러나 array가 std::vector
인 경우 array가 범위를 벗어나면 함수가 일찍 종료하는지에 관계없이 메모리는 할당 해제된다. 그러므로 std::vector는 직접 메모리 할당하는 것보다 훨씬 안전하게 사용할 수 있다.
Vectors remember their length
가리키는 배열의 길이를 모르는 내장 동적 배열과 다르게, std::vector는 길이를 추적한다. size()
함수를 통해 std::vector의 길이를 알 수 있다.
#include <vector>
#include <iostream>
int main()
{
std::vector<int> array { 9, 7, 5, 3, 1 };
std::cout << "The length is: " << array.size() << '\n';
return 0;
}
// 5
Resizing an array
std::vector의 크기는 resize()
함수 호출을 통해 조절할 수 있다.
#include <vector>
#include <iostream>
int main()
{
std::vector<int> array { 0, 1, 2 };
array.resize(5); // set size to 5
std::cout << "The length is: " << array.size() << '\n';
for (auto const &element: array)
std::cout << element << ' ';
return 0;
}
// The length is: 5
// 0 1 2 0 0
주목해야 할 두 가지 사항이 있다. 첫째, 배열의 크기를 조정할 때 기존 값은 보존된다! 둘째, 새 요소는 자료형의 기본값 (정수의 경우 0)으로 초기화된다.
std::vector의 크기를 더 작게 조정할 수도 있다.
#include <vector>
#include <iostream>
int main()
{
std::vector<int> array { 0, 1, 2, 3, 4 };
array.resize(3); // set length to 3
std::cout << "The length is: " << array.size() << '\n';
for (auto const &element: array)
std::cout << element << ' ';
return 0;
}
// The length is: 3
// 0 1 2
std::vector의 크기를 조정하는 것은 계산 비용이 많이 들기 때문에 조정 횟수를 최소화하기 위해 노력해야 한다.
이 포스트는 std::vector의 기초를 소개했다. 다음에 STL 포스트에서 std::vector의 몇 가지 추가 기능과 메모리를 어떻게 할당을 처리하는 방법에 대해 자세히 살펴볼 예정이다.
이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/6-16-an-introduction-to-stdvector/ 입니다.
출처: https://boycoding.tistory.com/214?category=1009770 [소년코딩]
'프로그래밍 언어 > [ C++ ]' 카테고리의 다른 글
[ C++ ] 07. 함수 포인터 (0) | 2021.02.09 |
---|---|
[ C++ ] 06. 디폴트 매개 변수 (0) | 2021.02.09 |
[ C++ ] 04. std::array (0) | 2021.02.08 |
[ C++ ] 03. auto (0) | 2021.02.05 |
[ C++ ] 02. 난수 생성 (0) | 2021.02.05 |