'배열'에 해당되는 글 1건

Posted on 2010/09/25 23:58
Filed Under ProgrammingTip

임의의 배열을 생성하여 vector를 초기화하는 코드는 아래와 같다.
// 배열을 한 개 생성하여, 배열로 vector를 초기화한다.
bool bArrary[] = {true, true, true, true, false};

vector<bool> vecArray( bArrary, bArrary+sizeof(bArrary)/sizeof(bArrary[0]) );

참 간단하다. 실제로 위의 코드가 작동되는 원리를 파악해 보자.


# 설  명
vector.h 파일을 살펴보면 vector를 초기화하는 코드 중에 다음과 같은 생성자가 있다.
template<class _Iter> vector(_Iter _First, _Iter _Last)
{
    // 이하 생략
    ...

인자 값으로 특정 STL 컨테이너 반복자(iterator)의 시작 위치와 끝 위치를 넣어 데이터를 담을 수 있다. 예를 들어 a라는 vector 컨테이너의 데이터를 vecArrary라는 또 다른 컨테이너에 전부 넣어 초기화를 하고 싶다면 다음과 같이 처리할 수 있다.
vector<bool> vecArrary( a.begin(), a.end() ); // vecArrary를 a 요소 값으로 담는다.

그렇다면 반복자라는 것은 무엇일까?

반복자 iter가 있다고 가정했을 때, 흔히 컨테이너를 순회하려면 ++iter 와 같이 ++연산자를 사용하여 현재 반복자가 어느 데이터를 가리키고 있는지 알 수 있다. 이처럼 반복자를 증가시켜 현재 가리키고 있는 데이터의 위치를 알 수 있듯이, 1컨테이너 안의 데이터들은 메모리 블록에 차례대로 쌓아놓게 되는 것이다. 즉, 반복자는 특정 컨테이너에서 해당 데이터의 메모리 위치를 가리키게 된다.

마찬가지로 배열 또한 데이터를 메모리 블록에 차례대로 쌓아놓아, 배열의 시작 주소부터 끝 주소까지 넣으면 그 값으로 컨테이너를 생성하게 되는 것이다.


# 정  리
사용자 삽입 이미지
배열과 vecotr 의 데이터는 메모리에 차례대로 위치한다.

vector를 생성할 때 초기화 함수 vector(_Iter _First, _Iter _Last) 의 값으로 데이터의 시작 주소와 끝 주소를 넣어주면 해당 데이터를 vector에 담게 된다. 마찬가지로 동일한 Sequence container인 배열 또한 시작 주소와 끝 주소를 넣어서 데이터를 vector에 담을 수 있다. 배열과 vector의 데이터가 메모리 주소값에 차례대로 있어서 가능한 일이다.


# 참고자료
위키피디아의 STL(Standard Template Library) 정보
다양한 기능을 제공하는 C++ 확장 라이브러리 Boost
크리에이티브 커먼즈 라이센스
Creative Commons License
  1. 여기서 알 수 있는 사실은 컨테이너에 데이터를 삽입하는 과정은 성능에 영향을 준다는 것이다. 컨테이너의 데이터들이 주소 값을 차례로 가지고 있어서 컨테이너의 최대 사이즈가 변경되면 알맞은 공간에 주소 값을 재할당하여 속도가 저하된다. 그래서 미리 최대 사이즈를 할당해 놓는 reserve() 함수를 사용하곤 한다.
2010/09/25 23:58 2010/09/25 23:58

About

by 외계고양이

Counter

· Total
: 87059
· Today
: 8
· Yesterday
: 48