Vector는, STL( Standard Template Library ) 에 포함된 동적 배열 데이터 구조이다.
vector는 배열과 유사하지만, 크기를 동적으로 조절할 수 있는 컨테이너이다.
일반적으로 동적 배열을 구현할때 사용하며, 임의접근이 필요할때 유용하다.
예를들어. 리스트나 큐와같이 순차적인 데이터에 비해 특정원소에 빠른 접근이 필요할 경우에 사용된다.
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector; // 정수형 원소를 담는 vector 생성
// 원소 추가
myVector.push_back(10);
myVector.push_back(20);
myVector.push_back(30);
// 원소 출력
for (int i = 0; i < myVector.size(); i++) {
std::cout << myVector[i] << " ";
}
return 0;
}
vector의 장점
- 동적 크기조절
- vector는 원소를 동적으로 추가하거나 제거할 수 있으며, 크기가 자동으로 조절된다.
- 빠른 임의 접근
- 배열과같이 임의접근이 빠르다. 원소를 인덱스를 사용하여 직접엑세스가 가능하다.
- STL과의 통합성
- C++의 표준 라이브러리의 일부임으로 다른 STL컨테이너 및 알고리즘과 호환성이 뛰어나다.
단점
- 삽입 삭제의 불편함
- 중간원소를 추가하거나 제거할 때 성능이 저하될 수 있다. list에 비해 느리다.
- 메모리 재할당
- 원소를 추가할때 할당된 메모리가 부족할경우. 재할당이 필요할 수 있으며 이때 매우 느려진다.
- 고정 크기가 아님
- vector의 크기는 동적으로 조절할 수 있지만. 특정크기로 고정할 수는 없다.
사용상 메모리의 재할당이 발생하면 매우 느리게 다시 재할당이 들어갈 수 있다.
이는 vector가 동적배열이기에 발생하는 경우인데.
일반적으로 vector가 생성되는 경우. OS가 임의적으로 메모리를 할당하여 그 범위 안에서 동작하게 된다.
일반적으로 vector가 선언되면 위와같이 임의의 메모리가 할당된다.
대충 위와같이 vector의 배열이 가득찼을경우. vector는 순차 데이터구조가 유지되어야 하기 때문에. 더는 데이터를 추가할 수 없는 경우가 생긴다.
이경우. OS는 데이터의 메모리할당을 위해서 다음과 같이 데이터 위치를 이동시키게 된다.
통째로 들어서 비워버리고. 더 비어있는 데이터공간으로 이동시켜버리기 때문에.
vector의 공간을 더 할당하기 위해 많은 연산을 하게된다.
그렇기 때문에. 위와같은 이사를 방지하기 위해. 처음에 vector의 위치를 잡을때 부터 그럴일이 없도록 범위를 아예 지정해버리거나. 빈 vector을 만들어버리는 방법이 있다.
초기용량 설정(reserve)
vector를 생성할 때 초기용량을 미리 지정하여 재할당 횟수를 가능한 최소로 줄일수 있다.
즉, 지금당장은 데이터가 할당되지는 않았지만. 나중에 할당될 수 있는 최대의 경우의 수를 미리 지정하여.
현 vector외에도 그 이후의 여유공간을 확보해놓는것이다.
std::vector<int> myVector;
myVector.reserve(100); // 초기 예상 크기 설정
초기용량 설정(resize)
vector를 생성할 때 초기용량을 지정하는게 아니라. 아예 빈 공간에 vector를 채워놓는것을 이야기한다.
지금당장 필요하지는 않지만 생성을 미리 전부 해놓음으로써 사용할 수 있게 정의하는것이다.
std::vector<int> myVector;
myVector.resize(100); // 원소를 추가하기 전에 용량을 설정
복사 오버헤드 줄이기(emplace_back)
위와 다른 결을 이야기하지만, 오버헤드 자체를 줄여서 메모리 사용량을 줄여버리는 효과가 있다.
일반적인 push_back의 경우. 데이터가 복사대입이지만. emplace_back의 경우 복사대입이 아닌 원본대입이기 때문에
데이터를 생성할 때 한번 덜 생성하는 효과가 있다.
myVector.emplace_back(42); // 복사 대신 생성자 호출
'C++' 카테고리의 다른 글
C++ FunctionPointer(함수포인터) (0) | 2023.11.10 |
---|