※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로
C++에 대한 구체적인 정보를 담고 있지 않습니다.
vector는 한마디로 동적배열
vector의 동작 원리(size / capacity)
중간 삽입/삭제
처음/끝 삽입/삭제
인덱스 접근
# 배열의 단점?
const int MAX_SIZE = 10;
int arr[MAX_SIZE] = {};
for (int i = 0; i < MAX_SIZE; i++)
{
arr[i] = i;
}
for (int i = 0; i < MAX_SIZE; i++)
{
cout << arr[i] << endl;
}
ㆍ 크기가 정적임
# vector
vector<int> v;
ㆍ 간단한 선언 방법.
★특성
1) 메모리를 처음 할당할 때 여유분을 두고 메모리를 할당한다.
# 여유분은 얼만큼이 적당할까??
# 증설을 얼만큼 해야할까??
vector<int> v;
for (int i = 0; i < 1000; i++)
{
v.push_back(100);
cout << v.size() << " " << v.capacity() << endl;
}
int a = v.size();
int b = v.capacity();
ㆍ size와 capacity를 찍어보면 크기가 다르다.
ㆍ size는 실제 사용 데이터 개수
ㆍ capacity는 여유분을 포험한 용량 개수이다
2) 여유분까지 꽉 찼으면, 메모리를 증설한다.
※ 기존에 데이터를 어떻게 처리할까?
# 메모리가 가득 찼을 때 이 전의 메모리를 삭제하고 원소를 복사 한 뒤 메모리를 재할당 하는 방식을 채택
ㆍ 이 복사가 일어나면 낭비가 일어날 수 있겠다. 복사 횟수를 줄이기 위해 여유분을 충분히 두는게 좋겠다.
# 극한의 누수를 막는다면 reserve키워드로 메모리를 더 아낄 수 있지않을까?
ㆍ reserve를 사용하면 처음부터 용량이 그만큼으로 되어있다. 근데 이 용량이 초과해도 어처피 capacity는 늘어난다.
# resize를 활용하면 데이터가 어떻게 되는걸까?
ㆍ resize는 1000개의 사이즈가 이미 할당되는 것이고 (사용되는 것) push_back으로 밀어주면 1001번째부터 쌓인다.
ㆍ 뭐... 굳이 사용하고싶으면v[i]로 접근하면 되긴 한다.
vector<int> v(1000, 0);
vector<int> v2 = v;
ㆍ 첫째줄 코드는 resize와 같은 말이다.
# v.clear() 를 하면 어떻게될까?
ㆍ 데이터는 싹 밀어줬지만 용량은 그대로 남아있는 모습이다.
ㆍ 아니 그럼 capacity까지 밀어버리고싶으면 어떻게해??
v.clear();
vector<int>().swap(v);
ㆍ 이렇게하면 두번째 벡터는 임시벡터. 얘는 생명주기 끝나면 소멸된다.
'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글
vector의 삽입삭제, 인덱스접근 (1) | 2024.09.28 |
---|---|
vector와 iterator (1) | 2024.09.28 |
콜백함수 (0) | 2024.09.27 |
클래스 템플릿 (0) | 2024.09.27 |
템플릿 기초 (함수템블릿) (0) | 2024.09.27 |