본문 바로가기

프로그래밍/C++

[C++] Insertion Sequance( std::vector, ... )

내용 삽입시 치환을 통해 값을 삽입합니다.
즉, 생성자가 불려져서는 안 되는 객체를 저장한다면
무조건 포인터로 저장해야합니다.

다음은 push_back을 쫓아간 내용입니다.
임의로 필요한 부분만 잘라다 붙였습니다.


void push_back(const _Ty& _Val)
{ // insert element at end
insert(end(), _Val);
}

iterator insert(iterator _Where, const _Ty& _Val)
{ // insert _Val at _Where
_Insert_n(_Where, (size_type)1, _Val);
}

void _Insert_n(iterator _Where,
size_type _Count, const _Ty& _Val)
{ // insert _Count * _Val at _Where
_Ty _Tmp = _Val; // 여기서 치환이 일어납니다.
fill(_ITER_BASE(_Where), _ITER_BASE(_Where) + _Count, _Tmp); // insert into hole
}

inline void fill(char *_First, char *_Last, int _Val)
{ // copy char _Val through [_First, _Last)
::memset(_First, _Val, _Last - _First);
}


_Val이 참조 호출로 계속 들어가다가
_Tmp로 치환되어
_Ty( const &_Ty )의 생성자가 실행됩니다.
그리고는 마지막으로 _Tmp는 memset을 통해 저장되지요.
그래서 _insert_n을 벗어날 때 소멸자도 한 번 실행이 됩니다.

매번 vector는 어떻게 자료저장을 해주나 궁금해서
직접 따라가보았더니
의외로 알기 쉽게 되어있네요. :)

뭐 요지는 내용 삽입시 치환을 통해 값을 삽입합니다. 라는 겁니다.