#include <iostream>
#include <vector>
using namespace std;
// 오늘의 주제 : vector
int main()
{
// vector [동적 배열]
// - vector의 동작 원리 (size/capacity)
// - 중간 삽입/삭제
// - 처음/끝 삽입/삭제
// - 임의 접근
// vector = 동적 배열 = 동적으로 커지는 배열 = 배열
// 원소가 하나의 메모리 블록에 연속하게 저장된다!
// 중간 삽입/삭제는 벡터는 연속되어 저장되기 때문에 데이터를 옮겨주어야하므로 효율이 나쁘다
// 처음 삽입/삭제는 중간 삽입/삭제와 같은 방식으로 처리되기 때문에 효율이 안좋다.
// 끝 삽입/삭제는 기존 데이터를 이동시킬 필요없이 끝만 변경하므로 효율이 좋다.
// 임의 접근 : i 번째 데이터는 어디 있습니까? -> v[i] 연속되어 있기 때문! 임의 접근 연산자를 지원한다.
vector<int> v(10,0);
v.reserve(1000);
v.push_back(1); //끝 삽입
v.pop_back(); //끝 삭제
v.insert(v.begin() + 2, 5); //중간 삽입
v.erase(v.begin() + 2); //특정 인덱스 삭제
v.erase(v.begin() + 2,v.begin()+4); //범위 삭제 v.begin()+2 ~ v.begin()+3 까지 삭제
vector<int>::iterator inserIt = v.insert(v.begin() + 1, 3); //추가한 위치를 가리킴
vector<int>::iterator eraseIt1 = v.erase(v.begin() + 2); //삭제된 위치를 가리킴
vector<int>::iterator eraseIt2 = v.erase(v.begin() + 2, v.begin()+4); //삭제된 위치를 가리킴
// 3이라는 데이터가 있으면 일괄 삭제가 필요한 경우
for (vector<int>::iterator it = v.begin();it != v.end();) {
int data = *it;
if (data == 3) {
it=v.erase(it); //it도 삭제되버리는 현상이 발생!
//따라서 v.erase()의 반환값을 it에 저장해주므로서 문제를 해결
}
else {
++it; //++it을 포문에서 실행할 경우 삭제된 위치를 it에 저장하기 때문에
//삭제된 위치로 이동된 데이터를 검사하지 않게됨
//따라서 포문에서 처리하는 대신 else문을 이용해 ++it을 실행
}
}
for (vector<int>::iterator it = v.begin();it != v.end();++it) {
cout << (*it) << endl;
}
return 0;
}