Vector
Vector
- std::vector는 STL에서 제공하는 동적 배열 컨테이너로, 크기를 동적으로 조정할 수 있어 배열을 유연하게 활용할 수 있다.
- 초기 크기가 꽉 차면 더 큰 배열을 할당하고 기존 요소를 새 배열로 복사한 다음 이전 배열을 해제한다.
- 재할당할 때 현재 크기의 두 배 정도로 확장하여 크기가 커질 수록 재할당 빈도가 줄어들어 성능을 최적화한다.
- 사용할 때 <vector>헤더를 추가해야 한다.
생성
vector<int> array; vector<int> array(10); vector<int> array = {1, 2, 3, 4, 5};
멤버 함수
자주 사용되는멤버 함수를 정리했다. 자세한 내용은 아래 사이트에서 볼 수 있다.
접근
// 인덱스를 통한 접근 array[]; // 이터레이터를 통한 접근 array.begin(); array.end(); // 사용법 int num = 5; cout << array[num]; ------------------------------------------ vector<int>::iterator it = array.begin()+2; cout << *it;
내부적으로 연속적인 메모리에 요소를 저장하므로, 인덱스를 사용해 빠른 접근이 가능하다. 컨테이너이므로 이터레이터를 통한 접근도 가능하다.
삽입
// 벡터의 맨 뒤/앞에 요소를 추가 array.push_back(value); array.push_front(value); // 특정 위치에 요소를 삽입 array.insert(); // 특정 위치에 요소를 삽입 array.emplace(); // 벡터의 맨 뒤에 요소를 삽입 array.emplace_back(); // 사용법 array.push_back(1); ---------------------------------- ::iterator it = array.begin()+2; array.insert(it, 2); ---------------------------------- ::iterator it = array.begin()+2; array.emplace(it, 7, "Sean"); array.emplace_back(7, "Sean");
push_back VS insert
push_back은 요소를 맨 뒤에 삽입하고 insert는 특정 위치에 삽입한다. insert는 해당 위치에 요소를 삽입하기 위해 특정 위치 이후의 요소들을 이동시킨다. push_back은 맨 뒤에 삽입만 하기 때문에 벡터의 크기가 부족해 재배치가 이루어지지 않는 이상 insert보다 성능이 좋다.
push_back VS emplace_back
push_back은 객체를 삽입하기 위해 임시 객체가 필요하지만, emplace는 가변인자 템플릿을 사용하여 객체 생성에 필요한 인자를 받아 내부에서 객체의 생성자를 한번만 호출한다. 쉽게 말해, push_back은 만들어진 객체를 삽입하고, emplace_back은 함수 내에서 객체를 생성해 삽입한다. 복사하는 과정이 생략되므로 emplace_back이 더 좋은 성능을 보인다. 벡터가 증가할 때마다 요소의 복사 또는 이동이 발생할 수 있다.
삭제
// 벡터의 맨 뒤 요소를 삭제 array.pop_back(); // 벡터의 맨 앞 요소를 삭제 array.pop_front();
확인
// 벡터가 비었는지 확인, 비었다면 true 안 비었다면 false 반환 array.empty(); // 요소의 수를 반환 array.size(); // 벡터의 용량 확인 array.capacity();
벡터는 처음 선언 및 초기화 단계에서 capacity가 정해진다. 요소를 추가로 삽입할 때 벡터의 크기가 충분치 않으면 capacity를 증가시킨다. 이후 pop을 해도 size는 줄어들지만 capacity는 그대로다.
조정
// 두 벡터를 교환 array.swap(); // 벡터의 용량을 변경 array.resize(); // 사용법 vector<int> v(5); vector<int>().swap(v); -------------------------------- array.resize(10); array.resize(10, 1);
swap은 두 벡터의 요소와 capacity를 교환하는 함수이다. 복사를 최소화 하기 때문에 성능이 향상되고, 메모리를 최적화 할 때에도 사용한다고 한다. resize는 벡터의 capacity를 변경한다. - 현재 크기보다 입력 값보다 작으면: 초과하는 요소를 삭제 - 현재 크기보다 입력 값보다 크면: 빈 공간은 0 또는 두번째 인자값으로 초기화