vector의 자료구조
vector의 자료구조는 배열과 비슷하다. 배열은 번호(인덱스)와 번호에 대응하는 데이터로 이루어진 자료구조를 나타낸다. 일반적으로 배열에는 같은 종류의 데이터가 순차적으로 저장된다. 문자 ABCDE를 배열에 저장한다면 아래 그림과 같이 저장된다.
배열의 크기는 고정이지만 vector는 동적으로 변하는 점이 vector와 배열 자료구조의 큰 차이점이다.
배열의 특징
1. 배열의 크기는 고정이다.
- 처음 설정한 크기를 넘어서 데이터를 저장할 수 없다.
2. 중간에 데이터 삽입, 삭제가 용이하지 않다.
- 배열은 데이터를 순차적으로 저장한다. 중간에 데이터를 삽입하면 삽입한 위치 이후의 데이터는 모두 뒤로 하나씩 이동해야 한다.
3. 구현이 쉽다.
4. 랜덤 접근이 가능하다.
- 배열은 데이터를 순차적으로 저장하므로 랜덤 접근이 가능하다.
vector를 사용해야 하는 경우
1. 저장할 데이터 개수가 가변적이다.
2. 주간에 데이터 삽입이나 삭제가 없다.
- vector는 배열처럼 데이터를 순차적으로 저장한다. 중간에 데이터 삭제 및 삽입을 하면 배열과 같은 문제가 발생한다.
3. 저장할 데이터 개수가 적거나 많은 경우 빈번하게 검색하지 않는다.
- 데이터를 순차적으로 저장하므로 많은 데이터를 저장한다면 검색 속도가 빠르지 않다.
검색을 자주 한다면 map이나 set, hash_map을 사용해야 한다.
4. 데이터 접근을 랜덤하게 하고 싶다.
- vector는 배열 같은 특성이 있어서 랜덤 접근이 가능하다.
vector VS. list
백터와 리스트는 비슷한 부분이 많기때문에 차이점을 잘 이해한 후 올바르게 사용해야 한다.
차이점은 크게 2가지이다
1. 중간 삽입, 삭제
2. 랜덤 접근
즉, 중간 삽입, 삭제가 없고 랜던접근을 자주 해야 된다면 vector
중간 삽입, 삭제가 자주 있으며 랜덤 접근이 필요 없으면 list가 좋다.
하지만, 저장되는 데이터가 적을경우에는 성능상 큰차이는 없다.
vector 사용방법
vector를 사용하려면 vector 헤더 파일을 포함해야 한다.
#include <vector>
vector 형식은 아래와 같다
vector< 자료형 > 변수이름
vector를 int 형에 대해 선언했다.
vector<int> vector1;
선언 후 vector를 사용한다. vector도 list처럼 동적 할당이 가능하다.
vector<int>* vector1 = new vector<int>;
vector의 주요 멤버들
기본 사용 멤버
1. 추가
- 기본적으로 원소의 마지막 위치에 추가하며 push_back을 사용한다, 처음이나 중간 위치에 추가할때는 insert를 사용한다.
vector<int> vector1;
vector1.push_back(1);
2. 삭제
- 기본적으로 마지막 위치의 원소를 삭제하며 pop_back을 사용한다. 처음이나 중간에 있는 원소를 삭제할 때는 erase를 사용한다.
vector1.pop_back();
3. 접근
- 첫 번째 위치의 반복자를 리턴할 때는 begin()을 사용한다. 첫 번째 원소의 참조를 리턴할 때는 front()를 사용한다.
- 마지막 다음의 영역(사용하지 않는 영역)을 가리키는 반복자를 리턴할 때는 end()를 사용한다. 마지막 원소의 참조를 리턴할 때는 back()을 사용한다.
특정 위치에 있는 원소를 접글할 때는 at()을 사용하면 된다.
int& Value1 = vector1.at(0); // 첫 번째 위치
const int Value2 = vector1.at(1); // 두 번째 위치
4. 모두 삭제
vector1.clear();
5. 데이터 저장 여부
bool bEmpty = vector1.empty();
데이터가 있으면 false, 없다면 true를 리턴한다.
6. vector에 저장된 원소 개수 알기
size()를 사용하여 vector에 저장 되어 있는 원소 개수를 조사한다.
vector<int>::size_type Count = vector1.size();
7. 기본 사용방법 예제코드
|
8. insert
9. erase
10. assign
|
11. reserve
- vector는 사용할 메모리 영역을 처음 선언할 때 정해진 값만큼 할당한 후 크기를 넘어서게 사용하면 현재 할당한 크기의 2배의 크기로 재할당 한다. vector에 어느 정도 데이터를 저장할지 예측할 수 있고, vector 사용 도중에 재할당이 일어나는 것을 피하려면 사용할 만큼의 크기를 미리 지정해야 한다. 참고로 reserve로 지정할 수 있는 크기는 vector에서 할당하는 최소의 크기보다는 커야 한다.
12. swap
- vector1과 vector2가 있을 때 두 개의 vector간에 서로 데이터를 맞바꾸기를 할 때 사용한다.
출처 : Thinking About C++ STL 프로그래밍 (최홍배 지음)
'C++ > STL' 카테고리의 다른 글
6. 셋(set) (0) | 2017.09.27 |
---|---|
5. 맵(map) (0) | 2017.09.26 |
4. 해시 맵(hash_map) (0) | 2017.09.25 |
3. 덱(deque) (0) | 2017.09.22 |
1. 리스트(list) (0) | 2017.09.20 |