강께르의 개발일지
[C++] vector 템플릿 클래스 본문
1. vector 클래스
- vector 클래스란 무엇인가? STL을 정리하면서 봤었는데 그 글의 일부와 따로 조사한 것들을 정리해보겠다.
- vector 클래스는 표준 시퀀스 컨테이너 중 하나이며, 선형 구조를 가진 배열 기반의 컨테이너이다. 동적 배열이라는 특징이 있다.
- 그렇기에 원소를 추가하거나 크기를 잡는 등 동적으로 수행하기 때문에 사용자가 많은 것을 생각하지 않게 하며 메모리를 효율적을 관리한다는 장점이 있다.
- 하지만 속도에서는 배열에 비해 떨어진다는 단점이 있지만 장점이 훨씬 커 많이 사용한다.
- 배열과 마찬가지로 연속된 메모리공간에 데이터를 저장한다. 그렇기에 메모리 재할당에 대한 리스크가 있다는 것도 단점이다.
2. vector 구조
- 다들 vector의 구조를 설명할려고 하면 그림을 다 첨부한다. 나도 참고해서 따로 만들어서 첨부할 것이다.
- v라는 vector가 있다고 가정하고 다음 그림을 보자.
- 이런 구조를 갖고있는데 하나하나 정리하면서 넘어가자
front() : 첫 번째 원소 값 / back() : 마지막 원소 값
begin() : 첫 번째 원소의 주소값 / end() : 마지막 원소의 다음 주소값
size() : 값이 들어간 원소의 갯수 / capacity() : 원소의 갯수와 별개로 현재 할당된 공간의 크기
push_back() : 현재 마지막 원소의 뒤에 데이터를 삽입 / pop_back() : 현재 마지막 원소를 제거
3. vector 선언
- 뭐든 사용하려면 그 사용법을 알아야한다. 가장 먼저 include를 통해 vector를 추가해야한다.
- 그 다음 선언을 해야하는데 선언은 주로 사용할 것 같은 방법만 정리했다. vector는 템플릿을 제공하는 컨테이너로 여기서는 int로 통일해 설명하도록 하겠다. 설명은 주석으로 하겠다. 원하는 선언 방법을 사용하면 되겠다.
#include<vector>
vector<int> v; // int 자료형 vector 생성
vector<int> v(5); // 5개의 원소를 0으로 초기화한 vector 생성
vector<int> v(5, 3); // 5개의 원소를 3으로 초기화한 vector 생성
vector<int> v1(v2); // 벡터 v를 복사하여 vector 생성
vector<vector<int>> v; // 2차원 배열 vector 생성
4. vector 멤버함수
- 아래의 함수들은 템플릿 선언이 int라고 가정한다.
- 멤버함수를 호출하는 객체를 v라고 가정한다.
함수 이름 | 설명 |
v.size() | 원소의 갯수 반환 |
v.capacity() | 할당된 공간의 크기를 반환 |
v.swap(vector) | v와 매개변수 vector와 바꿉니다. (원소와 capacity) |
v.insert(2, 3, 4) | 2번째 위치에 3개의 4를 삽입 뒤에 있는 원소들은 삽입된 수만큼 밀린다. |
v.insert(2, 5) | 2번째 위치에 5의 값을 삽입한다. 삽입한 곳의 반복자를 반환한다. |
v.erase(iter) | 반복자 iter가 가리키는 원소를 제거한다. size만 줄고 capacity는 그대로 |
v.erase(iter1, iter2) | 두 반복자를 매개변수로 받아 그 사이의 원소를 제거한다. |
v.empty() | vector가 비었으면 true를 반환 size 기준의 empty를 체크한다. No capacity. |
v.assign(3, 4) | 4의 값으로 3개 원소 할당한다. |
v.at(idx) | idx번째 원소를 참조한다. 혹은 원소를 반환한다. |
v[idx] | 위와 동일하다. 속도는 이게 더 빠르다. |
v.front() | 첫번째 원소를 반환한다. |
v.back() | 마지막 원소를 반환한다. |
v.clear() | 모든 원소를 제거한다. size는 줄어들고 capacity는 그대로 남아있다. |
v.push_back(7) | 마지막 원소 뒤에 원소 7을 삽입한다. |
v.pop_back(); | 마지막 원소를 제거합니다. |
v.begin(); | 첫번째 원소의 주소값을 반환한다. 반복자와 같이 사용 |
v.end() | 마지막 원소의 다음 주소값을 반환한다. 반복자와 같이 사용 |
v.rbegin() | 배열을 거꾸로 한 상태의 첫번째 원소의 주소값을 반환한다. 반복자와 같이 사용 |
v.rend() | 배열을 거꾸로 한 상태의 마지막 원소의 다음 주소값을 반환 반복자와 같이 사용 |
v.reverse(iter1, iter2) | 반복자 iter1이 가리키는 원소부터 반복자 iter2가 가리키는 원소까지의 범위를 지정, 원소들의 자리를 역순으로 바꾼다. |
v.resize(n, 3) | 크기를 n으로 변경한다. 만일 더 커졌을 경우, 그 값을 3으로 초기화한다. |
5. 반복자
- 컨테이너한테 컨테이너만의 반복자가 있다고 했다. vector도 vector만의 반복자를 사용해 컨테이너에 있는 원소를 접근하여 데이터를 사용할 수 있게 도와준다. 포인터와 비슷한 느낌이라고 보면 된다.
- 사용하는 코드는 아래와 같이 정리해놓았다.
// 선언
vector<T>::iterator iter;
// 초기화, vector의 시작 주소값을 대입한다.
iter = v.begin();
// 임의접근
cout << iter[1] << endl;
// 연산 사용
iter += 5;
cout << *iter << endl;
// vector의 순방향 접근
for (iter = v.begin(); iter != v.end(); iter++) {
cout << *iter << endl;
}
출처 :
'프로그래밍 > C++' 카테고리의 다른 글
[C++] C++의 형 변환 연산자 (0) | 2021.06.28 |
---|---|
[C++] list 템플릿 클래스 (0) | 2021.06.21 |
[C++] STL에 대해 (0) | 2021.06.18 |
[C++] 템플릿에 대해(클래스 템플릿) (0) | 2021.06.18 |
[C++] 템플릿에 대해(함수 템플릿) (0) | 2021.06.17 |