#include <iostream>
#include <vector>
using namespace std;
// 오늘의 주제 : vector
int main()
{
// STL (Standard Template Library)
// 프로그래밍할 때 자료구조/알고리즘들을
// 템플릿으로 제공하는 라이브러리
// 컨테이너9container) : 데이터를 저장하는 객체 (자료구조 Data Structure)
// 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;
}
// 동적 배열
// 매우 매우 중요한 개념 -> 어떻게 배열을 유동적으로 사용한 것인가?
// 1) 여유분을 두고 메모리를 할당한다.
// 2) 여유분까지 꽉 찼으면, 메모리를 증설한다.
// Q1) 여유분은 얼만큼이 적당할까?
// Q2) 증설을 얼만큼 해야 할까?
// Q3) 기존의 메모리에 저장된 데이터를 증설한 메모리에 어떻게 처리하는가?
//증설한 데이터에는 기존 데이터를 복붙하는 형식으로 진행
//실제 데이터개수의 1.5배~2배를 증설하게 컴파일러가 설계되어있다.
//증설된 여유분(capacity)은 데이터 개수(size)가 줄어들었을 때 같이 줄지 않는다
vector<int>v2(1000, 0); //size와 초기값을 선언시 초기화
vector<int>v3 = v2; //복사
vector<int> v;
v.reserve(1000); //여유분(capacity)을 지정함
v.resize(1000); //벡터의 크기(size)를 지정함
v.capacity(); //여유분을 포함한 용량 개수
const int size = v.size(); //벡터의 실제 사용하고있는 데이터 개수
for (int i = 0;i < 1001;i++) {
v.push_back(100);
cout << v.size() << " " << v.capacity() << endl; //여유분 = (실제 데이터개수x1.5)씩 증가
}
//증설된 여유분(capacity)은 데이터 개수(size)가 줄어들었을 때 같이 줄지 않는다
cout << v.capacity() <<" " <<v.size(); v.clear(); //clear를 했을 때 size는 0이 되었지만 capacity는 그대로인걸 알 수 있다.
vector<int>().swap(v); //임시 벡터랑 v를 스왑하므로써 v의 capacity를 초기화한다.
for (int i = 0;i <size;i++) {
//cout << v[i] << endl;
}
return 0;
}