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 |
4 |
2 |
5 |
4 |
2 |
|
위와 같이 모든 원소가 한칸씩 내려온다. 원소가 적다면 크게 상관없겠지만 만약 벡터의 원소가 아주 많다면 매우 비효율적이다.
삽입또한 마찬가지다 만약 첫번째 원소에 어떤 값을 삽입하면
5 |
4 |
2 |
1 |
2 |
5 |
4 |
2 |
1 |
위와같이 모든 원소가 한칸씩 밀려나고 그 자리에 원소를 삽입한다.
따라서 벡터는 특정원소에 삽입 및 삭제를 하는것은 옳지 않다.
만약에 삽입 삭제가 빈번하다면 벡터대신에 리스트를 사용하는것이 옳다.
벡터의 원소 삽입 삭제는 push_back()과 pop_back()을 이용하여 마지막 원소의 값을 빼거나 넣는 작업을 하여야 한다.
vectorv; 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++] 예외 처리 (Exception) (0) | 2013.07.06 |
[C++] 템플릿(template) (0) | 2013.07.06 |
[C++] 상속 (inheritance) (0) | 2013.07.04 |