vector container

김신·2023년 1월 26일
0

C++

목록 보기
4/8
post-thumbnail

vector container?

벡터는 크기가 변경될 수 있는 배열을 나타내는 시퀀스 컨테이너를 의미합니다.

배열과 마찬가지로 벡터의 요소는 연속적으로 메모리에 저장됩니다. 즉, 요소에 대한 일반 포인터의 오프셋을 사용하여 배열에서와 마찬가지로 효율적으로 요소에 액세스할 수 있습니다. 그러나 배열과 달리 스토리지가 컨테이너에 의해 자동으로 처리되므로 크기가 동적으로 변경될 수 있습니다.

내부적으로 벡터는 동적으로 할당된 배열을 사용하여 요소를 저장합니다. 새 요소가 삽입될 때 크기를 늘리기 위해 이 배열을 재할당해야 할 수 있습니다. 이는 새 배열을 할당하고 모든 요소를 해당 배열로 이동하는 것을 의미합니다. 이는 처리 시간 측면에서 상대적으로 비용이 많이 드는 작업이므로 요소가 컨테이너에 추가될 때마다 벡터가 재할당되지 않습니다.

대신, 벡터 컨테이너는 앞으로 일어날 요소 삽입을 대비해 일정량의 메모리를 미리 준비합니다. 그 이후 요소 삽입으로 메모리가 다시 한번 꽉 찬다면 새롭게 배열을 이동하면서 일정량 메모리를 또 다시 미리 준비합니다. 만약 현재 메모리 공간인 24byte가 꽉 찬다면 배열을 새 메모리 공간에 이동하면서 48byte의 메모리를 추가적으로 준비합니다. 새 매모리 공간을 준비하면서 확보하는 메모리는 현재 메모리의 2배입니다.

vector container의 사용

#include <vector>

using namespace std;

vector <Type> 변수명; 

vector 생성자

vector v;
- 비어있는 vector v를 생성합니다.

vector v(5);
- 기본값(0)으로 초기화 된 5개의 원소를 가지는 vector v를 생성합니다.

vector v(5, 2);
- 2로 초기화된 5개의 원소를 가지는 vector v를 생성합니다.

vector v2(v1);
- v2는 v1 vector를 복사해서 생성됩니다.

vector 맴버함수

vector v; 라고 가정.

v.assign(5, 2);
- 2의 값으로 5개의 원소 할당.

v.at(idx);
- idx번째 원소를 참조합니다.
- v[idx] 보다 속도는 느리지만, 범위를 점검하므로 안전합니다.

v[idx];
- idx 번째 원소를 참조합니다.
- 범위를 점검하지 않으므로 속도가 v.at(idx)보다 빠릅니다.

v.front();
- 첫번째 원소를 참조합니다.

v.back();
- 마지막 원소를 참조합니다.

v.clear();
- 모든 원소를 제거합니다.
- 원소만 제거하고 메모리는 남아있습니다.
- size만 줄어들고 capacity는 그대로 남아있습니다.

v.push_back(7);
- 마지막 원소 뒤에 원소 7을 삽입합니다.

v.pop_back();
- 마지막 원소를 제거합니다.

v.begin();
- 첫번째 원소를 가리킵니다. (iterator와 사용)

v.end();
- 마지막의 "다음"을 가리킵니다 (iterator와 사용)

v.rbegin();
- reverse begin을 가리킨다 (거꾸로 해서 첫번째 원소를 가리킵니다)
- iterator와 사용.

v.rend();
- reverse end 을 가리킨다 (거꾸로 해서 마지막의 다음을 가리킵니다)
- iterator와 사용.

v.reserve(n);
- n개의 원소를 저장할 위치를 예약합니다(미리 동적할당 해놉니다)

v.resize(n);
- 크기를 n으로 변경한다.
- 더 커졌을 경우 default값인 0으로 초기화 한다.

v.resize(n,3);
- 크기를 n으로 변경한다.
- 더 커졌을 경우 인자의 값을 3으로 초기화한다.

v.size();
- 원소의 갯수를 리턴한다.

v.capacity();
- 할당된 공간의 크기를 리턴한다.
- 공간 할당의 기준은 점점 커지면서로 capacity를 할당하게 됩니다.

v2.swap(v1);
- v1과 v2의 원소와 capacity 바꿔줍니다. (모든걸 스왑해줌)
- v1의 capacity를 없앨때 (할당한 메모리를 프로그램이 끝나기 전에 없애고 싶을때) 사용하기도 합니다.
- v2를 capacity가 0인 임시 객체로 만들어서 스왑을 해줍니다.
- vector().swap(v1);

v.insert(2, 3, 4);
- 2번째 위치에 3개의 4값을 삽입합니다. (뒤엣놈들은 뒤로 밀림)

v.insert(2, 3);
- 2번째 위치에 3의 값을 삽입합니다.
- 삽입한 곳의 iterator를 반환합니다.

v.erase(iter);
- iter 가 가리키는 원소를 제거합니다.
- size만 줄어들고 capacity(할당된 메모리)는 그대로 남습니다.
- erase는 파라미터 하나를 받을때와 두개를 받을 때 다릅니다.
- 그에 따른 예제는 여기있습니다.

v.empty()
- vector가 비었으면 리턴 true
- 비어있다의 기준은 size가 0이라는 것이지, capacity와는 상관이없습니다.

0개의 댓글