강께르의 개발일지

[C++] vector 템플릿 클래스 본문

프로그래밍/C++

[C++] vector 템플릿 클래스

강께르 2021. 6. 18. 17:02

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