본문 바로가기
Programming/C C++

C++ STL Vector 컨테이너

by whitele 2021. 5. 24.
반응형

개요

 vector는 순차 컨테이너 (Sequence container)로 배열처럼 사용할 수 있다. 일반 배열보다 많은 기능을 제공하며 배열을 기반으로 만들어진 컨테이너이다.

Vector 컨테이너

생성자

  • vector ve    vector ve(n)   : 빈 벡터 또는 n만큼 빈 벡터를 생성한다.
  • vector ve(n, x) : x로 초기화된 n만큼의 벡터 ve를 생성한다.

복사 생성자도 존재한다.

멤버 함수

  • ve.assign(n, a) : ve값에 a 값으로 n개만큼 할당한다.
  • ve.at(i) : ve의 i 번째를 참조한다.
  • ve.front( ) : ve의 맨 첫 원소를 참조한다.
  • ve.back( ) : ve의 맨 마지막 원소를 참조한다.
  • ve.begin( ) : ve의 첫 원소로 하는 반복자
  • ve.rbegin( ) : ve의 첫 원소로 하는 역순 반복자
  • ve.end( ) : ve의 마지막 원소로 하는 반복자
  • ve.rend( ) : ve의 마지막 원소로 하는 역순 반복자
  • ve.capacity( ) : ve에 할당된 공간 크기 반환
  • ve.clear( ) : ve 초기화
  • ve.insert(p, x) or (p, n, x) : ve의 p 위치에 n개의 x값을 삽입 또는 n만큼 x값을 삽입한다.
  • ve.max_size( ) : ve 할당 가능한 최대 크기를 반환한다.
  • ve.reserve(n) : n개의 원소를 예약한다.
  • ve.resize(n) or (n, x) : ve의 크기를 n으로 확장, 재조정 또는 확장되는 값을 x로 초기화
  • ve.size( ) : ve의 원소 개수 반환 (unsigned int형으로 반환한다.)
  • ve.swap(ve2) : ve와 ve2를 스왑 한다.

vector의 함수중 특징은 메모리 할당 크기를 알 수 있도록 capacity() 함수를 제공하고 미리 메모리를 할당할 수 있는 reserve() 함수를 제공한다. push_back(), erase(), insert()가 빈번히 일어나는 경우 vector를 사용하지 않는 것이 좋다. [] 연산자를 제공하며 범위 검사를 하지 않는다.

vertor의 기본 사용 예

#include <iostream>
#include <vector>
using namespace std;

int main(){
	vector<int> ve;
	cout<<"capacity:"<<ve.capacity()<<endl;
	ve.push_back(1);
	ve.push_back(2);
	ve.push_back(3);
	
	for(unsigned int i=0;i<ve.size();i++){//for(vector<int>::size_type i=0;i<ve.size();i++){}
		cout<<ve[i]<<endl;
	}
	return 0;
}

vector 사용 예시

vector의 문제

 vector는 배열 기반 컨테이너이기에 새로 원소를 추가할 때마다 배열을 재할당하고 원소들을 복사해야 하는 문제가 발생한다. 이렇게 되면 새로 추가할 때마다 느려지는 문제가 발생한다. 계속 모든 쌓인 원소를 복사해야 해서 원소가 많으면 많을수록 느려진다. 미리 넉넉히 배열을 할당함으로써 이를 해결할 수 있다.

#include <iostream>
#include <vector>
using namespace std;
int main(){
	vector<int> v;
	for(int i=0;i<10;i++){
		cout<<"size:"<<v.size()<<" "<<"capacity:"<<v.capacity()<<endl;
		v.push_back(i);
	}
	
	return 0;
}

capacity 실행 이미지

 위와 같이 중간 이상부터 미리 공간을 넉넉히 할당하는 모습이다. 그러나 이것 역시 미리 10개를 할당하는 것보다는 성능적으로 차이가 발생한다. 때문에 reserve() 함수를 이요하여 미리 할당하는 방법이 있다.

반복자

 반복자는 순회 가능하며 마치 포인터처럼 동작한다. iterator를 활용하여 중간에 삽입 삭제도 가능하다.

vector<int>::iterator iter2
vector<int>::iterator iter1=ve.begin()
728x90
반응형

댓글