Skip to content

Std::vector

vector는 STL에서 가장 자주 사용합니다. 프로그래밍을 할 때 가장 자주 사용하는 자료구조는 배열입니다. vector는 배열을 대체하여 사용할 수 있습니다. vector는 배열과 비슷한 면이 많아서 STL 컨테이너 중에서 이해하기가 가장 쉽고 또 어디에 사용해야 하는지 알기 쉽습니다. 앞서 연재한 list에 대한 글을 보신 분들은(또는 아시는 분들은) vector와 사용 방법이 비슷한 점이 많아서 list보다 훨씬 더 빠르게 이해하리라 생각합니다. list에서 이미 언급한 몇몇 부분은 다시 언급하지 않으니 list에 대한 글을 보지 않으신 분은 꼭 보시기 바랍니다.

2차원 배열 구현방법

참조: http://neodreamer.tistory.com/19 선언은 아래와 같이 하면 된다.

vector < vector < int > > vcArray;

초기화 방법은 아래와 같이 for문을 사용하면 된다.

for ( int i = 0 ; i < ROW; ++i ) { // 주어진 ROW 만큼 반복
    vector<int> elem; // vector 를 생성하고
    elem.resize(COL); // 원하는 COL 크기로 할당
    vcArray.push_back(elem); // 배열에 추가
}

각각의 ROW에 포함된 COL 데이터를 삭제하고 마지막으로 ROW 데이터를 삭제하면 된다.

for (int row = 0; row < (int)vcArray.size(); ++row)
    vcArray[row].clear();
vcArray.clear(); 

아래와 같이 사용하면 하면 된다.

int temp = vcArray[1][2]; 
vcArray[1][2] = 3;

기존의 C API에 vector를 넘기는 방법

vector를 포인트형 배열로 바꾸는 방법 이다.

데이터에 대한 포인터를 넘기는 경우 아래와 같이 사용하면 된다.

vector<int> v;
&v[0]

C++ 표준에 의하면 vector 내의 데이터 요소들은 연속 메모리에 저장되도록 정해져 있다. 즉, 배열과 동일하다.

if ( !v.empty() ) {
    // 빈 벡터일 때 v.size()가 0인 상황에서 &v[0]은 존재하지 않은 메모리의 주소값을 만드려고 하니 결국 오작동을 일으키게 된다.
    // 따라서 v.empty()로 빈 벡터인지를 검사할 필요가 있다.
    doSomething( &v[0], v.size() );
}

주의할 점은 컴파일러 종류에 따라 &v[0] 대신에 v.begin()을 쓰라는 컴파일러 경고 메시지를 볼 수 있다. 굳이 v.begin()을 쓰려면 &*v.begin() 라고 쓰면 된다.

See also

Favorite site

References


  1. About_stl-cpp_stl_programming.pdf