STL - vector #3

이승덱·2021년 7월 21일

CPP

목록 보기
49/70
#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;

}
profile
공부 기록용 블로그입니다

0개의 댓글