티스토리 뷰


이번편의 주제는 원소의 할당 전략입니다. 



원소의 대입 혹은 할당전략은 여러가지가 있을 수 있습니다.


1. for문을 이용한 할당


(push_back, 혹은 공간을 할당받은 후 [], 반복자를 통한 할당)



2. algorithm function사용


copy, fill, replace등의 함수가 대표적인 함수들.



3. range member function( or range constructor) 사용.


insert, assign함수나 range 생성자를 이용한 방법입니다.




1번의 경우에는 stl에 있어 권장되지 않는 방법입니다.

for문으로 인해 함수의 호출횟수가 비효율적으로 증가하며 가독성도 떨어지기 때문입니다.



2번의 경우에는 코드가 간결해지고 가독성도 좋아지긴 하나 실제로는 반복문을 암시적으로 사용하고 있습니다.


http://www.cplusplus.com/reference/algorithm/copy/?kw=copy


실제 함수 내부를 보면 while문을 이용해 대입연산을 하고 있음을 알 수있습니다.



3번의 경우가 책의 저자가 권장하는 방법입니다.


(1) 코드가 간결하다


(2) 가독성이 좋으며 하려는 행위가 명백히 드러난다.








다음 코드와 그 결과를 보면 insert가 push_back보다 성능면에서 왜 이득인지 알 수 있습니다.


기본적으로 한개의 객체만 넣는다고 하면 성능상에서 차이는 거의 없겠으나 여러개를 


넣는다고 할 때는 insert가 당연 좋습니다.


insert나 push_back이나 새로운 원소(들)을 넣게 되어 reserve보다 size가 커진다면 reallocation이 발생합니다. 


문제는 push_back으로 한개한개 넣는다고 하면 매번 reallocation이 발생하는 반면,


range insert를 시도하게 되면 단 한번의 reallocation을 통해 새로운 공간에 객체들을 복사해 할당하게 됩니다.


(단, reseve가 새로 넣을 갯수보다 크다면 재할당이 일어나지 않기때문에 성능상 차이는 없을것입니다.


하지만 불필요한 함수의 호출이 늘어나는 만큼 이 또한 성능상 차이가 날 수 밖에 없습니다.)



range insert때 새로 할당해야할 크기를 알 수 있는건 


insert 함수 내부에서 distance함수를 통해 추가되는 크기를 알 수 있습니다.


(다른게 아닌, iterator의 operator-연산을 통해 end-first로 크기를 구합니다)




추가로, erase역시 range를 통해 효과적으로 지울 수 있겠습니다.


단, 객체가 삭제된다고 reserve된 공간까지 자동으로 줄어들진 않기 때문에


이를 위한 전략이 별도로 필요하겠으며 이는 추후의 장에서 논의될것입니다. (item14)

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함