[C++]벡터(Vector)클래스 사용법

Posted 2007/08/26 15:19

1. 벡터(Vector)란?

벡터(Vector)는 deque, list 등과 같이 STL이 제공하는 자료형중 하나이다.


2. 벡터(Vector)의 특징

  첫번째, 메모리에 구성요소가 연속적으로 저장되어있다. 만약 할당된 메모리가 부족하면 2배 길이의 새로운 연속된 메모리를 찾아서 할당을 한다.

 두번째, 반복자(iterator)와 배열 첨자를 사용하여 접근할 수 있다.
 
 세번째, 원하는 위치에 삽입이 가능하지만, 가운데 삽입하면 뒤의 자료들이 한칸씩 뒤로 밀린다. 반대로 삭제를 하면 한칸씩 당겨진다. 자칫 잘못하다가 프로그램이 비 효율적이 될 수 있다.

 네번째, Template를 사용하여, 형식에 대하여 자유롭다.


3. 선언 방법

 vector<형식> 사용할이름; 과 같이 선언하면 된다.
Example : vector<int> iVector;


4. 접근 방법

 접근 방법엔 두 가지가 있다.

 ㄱ. iterator를 사용한 접근 방법.
vector<형식>::iterator iterator이름; 과 같이 iterator를 선언 한 후, 사용한다. iterator는 이미 아시겠지만, 주소값을 가지게 된다. 때문에, iterator가 지정하는 값을 표현하려면 포인터(*)를 사용해주자.

 ㄴ. 배열과 같이 인덱스를 사용한 접근 방법.
배열처럼 []를 사용하여 접근 할 수 있다.


5. 요소 추가, 삭제 방법

 ㄱ. 기본적 추가 삭제 :  vector.push_back()과 vector.pop_back()
 이 두 가지는 맨 마지막 부분에만 추가, 삭제가 이루어진다. push_back()은 인수로써 벡터가 가지는 자료형과 같은 자료형을 가진 값을 써주면 된다. pop_back()은 Return 형식이 Void이다. Stack이나 Queue처럼 pop을 할 경우 값을 돌려주지 않으며, 바로 삭제가 된다는 것을 유념하자.

 ㄴ. 중간 부분에 추가, 삭제 : vector.insert()와 vector.erase()
 이 두가지는 중간에 추가, 삭제가 가능하지만, 효율이 떨어진다는 것을 유념하자.
insert()는 2가지를 인수로 받는다. 먼저 삽입을 할 위치정보를 iterator형식으로 만든것 하나, 그리고 추가할 값. erase()는 삭제할 위치정보를 iterator형식으로 만든것 하나를 인수로 사용한다. pop_back()과 마찬가지로 삭제한 값을 돌려주지 않는다는 것도 유념하자.


6. Vector사용 예제

#include <vector>
#include <time.h>
#include <stdio.h>

using namespace std;

void main()
{
     srand((unsigned)time(NULL));

     vector<int> iVector; //int형식의 Vector 선언
     vector<int>::iterator iVec_it; //int형식의 Vector를 가르키는 Iterator 선언

     for(int i=1;i<=10;i++)
          iVector.push_back(rand()%9+1); //1~10사이의 랜덤 정수를 Vector에 추가

     printf("Vector : ");
     for(int i=0;i<(int)iVector.size();i++) //Vector의 첨자를 사용한 접근
          printf("%d ",iVector[i]);
     printf("\n");

     iVec_it = iVector.begin()+3; //Iterator에 백터의 시작점부터 3번째 뒤 위치를 알려준다.
     iVector.insert(iVec_it,100); //100이란 값을 추가

     printf("Vector : ");
     for(int i=0;i<(int)iVector.size();i++) //Vector의 첨자를 사용한 접근
          printf("%d ",iVector[i]);
     printf("\n");

     iVec_it = iVector.begin()+3; //Iterator에 백터의 시작점부터 3번째 뒤 위치를 알려준다.
     iVector.erase(iVec_it); //Iterator가 가르키는 위치의 값을 삭제

     printf("Vector : ");
     for(iVec_it = iVector.begin(); iVec_it != iVector.end(); iVec_it++)
             //Vector의 Iterator를 사용한 접근
          printf("%d ", *iVec_it);
     printf("\n");

     iVector.pop_back(); //맨 뒤 요소 하나를 제거한다.

     printf("Vector : ");
     for(iVec_it = iVector.begin(); iVec_it != iVector.end(); iVec_it++)
             //Vector의 Iterator를 사용한 접근
          printf("%d ", *iVec_it);
     printf("\n");  
}

[Result]
Vector : 3 3 3 7 4 8 2 1 6 1
Vector : 3 3 3 100 7 4 8 2 1 6 1
Vector : 3 3 3 7 4 8 2 1 6 1
Vector : 3 3 3 7 4 8 2 1 6

** 이 글의 저작권은 모두 저자에게 있습니다.
   수정, 배포시 저작권을 표시해주시기 바랍니다.
** 오타, 잘못된 내용이 있으면 적극적으로 알려주시기 바랍니다 :)
** 질문사항 또한 적극적으로 받겠습니다.

Copyright (c) NEWMS 2007 All right Reserved.
크리에이티브 커먼즈 라이선스
Creative Commons License
Write your message and submit
« PREV : 1 : ... 24 : 25 : 26 : 27 : 28 : 29 : 30 : 31 : 32 : ... 35 : NEXT »