C++ 스탠다드 라이브러리 (std) 안에 있는 스탠다드 템플릿 라이브러리(stl)에 포함된 시퀀스 컨테이너이며, 데이터와 메모리를 분리한 개념에 배열기반 메모리 구조를 가지고 있는 자료구조입니다.
중간에 삭제되는 데이터가 없고, 인덱스로 접근이 가능하며 반복문을 통해 순회를 돌리는 경우에 std::vector를 사용해 관리합니다. 게이지 관리 중 서로 인덱스 값을 통해 데이터를 변경할 때 사용
resize와 reserver 차이
(1) reserve()
- 공간이 예약된다.
- 배열을 만들때 int array[크기] 하는것과 같다.
- 만약 앞으로 데이터가 자주 추가된다면 벡터가 가득 찼을때 스스로 공간을 늘리지 않기 때문에 성능을 더 향상할 수 있다.
- 만약 전부 찬상태에서 또 집어넣으면 늘어난다.
std::vector<int> numvector;
numvector.reserve(10);
//numvector.resize(10);
for(int i=0; i<11; i++)
numvector.push_back(i);
std::cout << numvector.capacity()<<"\n";
std::cout << numvector.size()<<"\n";
for(int i=0; i<numvector.size(); i++)
std::cout << numvector[i] << "\n";
배열의 크기(capacity) 만 증가 -> 10
size의 값은 증가하지 않았으므로 인덱스 0번부터 push_back이 들어가며 값을 채움 -> reserve 범위를 벗어나면 전부 찬상태에서 또 집어넣으면 늘어난다.
- 이미 늘어난 capacity와 size를 reserve로 줄일수는 없다.
-> 늘리는건 가능 ex) 10 -> 5 X
(2) resize()
- 공간 예약 + 안의 모든 공간을 특정한 값(null or 0 둘다 같은 말)으로 채운다.
- 변수를 만들때 쓰레기값이 없게 하기위해 NULL로 초기화 하는것과 비슷하다. ex) int array[10] = {0 ,}
-현재보다 큰 공간을 예약하면 그만큼 더 집어넣는다. ex) 5개가 들어있는 상태에서 resize(10)하면 5개가 더들어감 -> 5 + 5 = 10
-용량이 딱 정해져 있다. 더들어 오게 된다면 버려지게 된다. [] 사용시 , push_back은 예외
std::vector<int> numvector;
//numvector.reserve(10);
numvector.resize(10);
for(int i=0; i<10; i++)
numvector.push_back(i);
std::cout << numvector.capacity()<<"\n";
std::cout << numvector.size()<<"\n";
for(int i=0; i<numvector.size(); i++)
std::cout << numvector[i] << "\n";
resize -> 배열의 크기(capacity)와 size 크기를 동시 증가 -> 10
push_back -> vector의 size와 capacity(push_back을 하면서 자동 확장)
- 이미 resize로 확장된 크기 뒤에 push_back으로 들어오는 애들은 뒤에 추가
- 이미 늘어난 capacity를 resize로 줄일수는 없다.
-> 늘리는건 가능 ex) 10 -> 5 X
-> 카피부분 -
ex)
이미 앞에서 resize(5)를해서 벡터가 00000으로 채워져 있다.
-> for 문을 통해 num[i]=i -> 0 1 2 3 4 값을 저장
-> resize(10) capacity와 size를 확장 (0 1 2 3 4 0 0 0 0 0) 과정 분석
-> resize(5) vector a -> 0 1 2 3 4
-> resize(10) vector a1 -> 0 0 0 0 0 0 0 0 0 0
al=a -> 깊은 복사 -> 0 1 2 3 4 0 0 0 0 0 이런 결과가 나온다.
void Copy(const CArray& _Other)
{
NumValue = _Other.NumValue;
// 깊은 복사를 해줘야 합니다.
ReSize(NumValue);
for (int i=0; i<NumValue; i++)
ArrPtr[i] = _Other.ArrPtr[i];
}
void ReSize(int _Size)
{
if (0 >= _Size)
MsgBoxAssert("배열의 크기가 0일수 없습니다");
// CArray<int>* Array = new CArray<int>[10];
DataType* Ptr = ArrPtr;
ArrPtr = new DataType[_Size];
int CopySize = NumValue <= _Size ? NumValue : _Size;
for (int i=0; i<CopySize; i++)
ArrPtr[i] = Ptr[i];
NumValue = _Size;
if (nullptr != Ptr){
delete[] Ptr;
Ptr = nullptr;
}
}
push_back
-> vector의 size와 capacity(push_back을 하면서 자동 확장)
- 메모리 할당 -> 공간을 만든다.
- 거기에 데이터를 넣는다. -> 그 공간 안에 데이터 삽입
- 데이터를 집어 넣을때 기존 크기보다 더 크게 확장해서 사용한다는 것
-> 기존 만들어진 vector의 공간에서 새로운 확장된 공간을 만들고 그 안의 데이터 복사
-> 기존 있던 공간과 데이터 지우고 새로 확장된 공간에 데이터 삽입
clear();
- 데이터(size)만 지우고 메모리( capacity )는 그대로 남아있다.