본문 바로가기

Language, IDE/C, C++

[C++ STL] 벡터(vector)

C++에서 배열의 인자는 상수이기 때문에 길이를 변경할 수 없다. 프로그래밍을 하다보면 동적인 길이의 배열을 생성해야하는 경우가 

있다. C++에서 동적 배열을 생성할 수 있지만 배열의 크기를 늘리는 과정은 코드가 비효율적이되고 복잡하다. 

벡터(Vector)는 런타임에 그 크기가 변경될 수 있는 배열과 같은 자료구조다. 벡터는 배열과 거의 유사하게 사용할 수 있다.

벡터는 인덱스구조를 사용하기 때문에 임의 접근이 가능하고 탐색이 빠르다.

하지만 인덱스구조를 항상 유지하기 위해서 임의의 위치에 있는 원소를 삽입 및 삭제하기 위해서는 많은 시간이 소요된다.


벡터는 <vector>라이브러리에 정의되어있고 네임스페이스 std에 정의되어있다.

#include <vector>
using namespace std;



벡터의 생성

벡터는 일반 템플릿 클래스처럼 사용한다.

vector<int> v1;         //int형의 벡터 생성
vector<int> v2(5);    //int형의 크기가 5인 벡터 생성(모두 0으로 초기화)
vector<int> v3(v2);    //int형의 v2와 같은 크기인 벡터 생성(v2와 같은 값 가짐)


값 할당 및 접근

값 할당 방법은 여러가지가 있다. 배열 처럼 []를 사용할수도 있고 push_back이란 함수를 사용할 수도있다.

vector<int> v(5);
v[1] = 3;             //1번째 자리에 3 할당
v.push_back(5);  // 벡터의 끝에 5할당

//size를 이용한 접근
for(int i=0;i<v.size();i++) {
 int temp = v[i];
}
//iterator를 이용한 접근
for(vector<int>::iterator it = v.begin();it!=v.end();it++){
 int temp = *(it);
}


삽입 및 삭제

벡터의 최대 단점은 임의의 자리에 있는 원소의 삽입 및 삭제가 어렵다(비효율적이다)는 점이다.

만약 크기가 4인 벡터에서 첫번째 원소를 제거하였다고 하면


 3


 5

 

위와 같이 모든 원소가 한칸씩 내려온다. 원소가 적다면 크게 상관없겠지만 만약 벡터의 원소가 아주 많다면 매우 비효율적이다.

삽입또한 마찬가지다 만약 첫번째 원소에 어떤 값을 삽입하면


 5


 2

위와같이 모든 원소가 한칸씩 밀려나고 그 자리에 원소를 삽입한다.

따라서 벡터는 특정원소에 삽입 및 삭제를 하는것은 옳지 않다. 

만약에 삽입 삭제가 빈번하다면 벡터대신에 리스트를 사용하는것이 옳다.

벡터의 원소 삽입 삭제는 push_back()과 pop_back()을 이용하여 마지막 원소의 값을 빼거나 넣는 작업을 하여야 한다.

vector v;
v.push_back(3);  //벡터의 마지막위치에 3할당
v.pop_back();     //벡터의 마지막위치의 원소 제거


크기와 용량

벡터의 크기는 벡터에 실제로 들어있는 원소의 수이다.

벡터의 용량은 벡터에 저장될 수 있는 원소의 수이다.


주요 함수


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


resize()                크기를 변경한다. 새 크기가 더 클 경우 벡터의 원래 내용은 유지하고 새로 할당된 원소는 0으로 초기화한다.


capacity(n)           할당된 용량을 리턴한다.


reserve(n)            용량을 변경한다. 새 크기가 더 클 경우 벡터의 원래 내용은 유지하고 새로 할당된 원소는 초기화 하지 않는다.


empty()                비어있는지 조사한다. 비어있으면 true아니면 false를 리턴한다.


clear()                 모든 원소를 삭제한다.


push_back(n)       벡터의 마지막 위치에 원소를 삽입한다.


pop_back()           벡터의 마지막 위치의 원소를 제거한다.





'Language, IDE > C, C++' 카테고리의 다른 글

[C++] Thread(쓰레드, 스레드)  (9) 2013.07.08
[C++] string to int, int to string  (0) 2013.07.07
[C++ STL] 벡터(vector)  (1) 2013.07.07
[C++] 예외 처리 (Exception)  (0) 2013.07.06
[C++] 템플릿(template)  (0) 2013.07.06
[C++] 상속 (inheritance)  (0) 2013.07.04