티스토리 뷰



이번 주제는


컨테이너의 원소가 비어있는지 여부를 확인하기 위해 size()보다 empty()를 호출하라는 주제입니다.


하지만 결론부터 말씀드리면 c11에 와서는 성능상의 차이가 없게 되었습니다.


다만 코드에서 좀더 표현을 명료하기 위해 비어있는지 여부를 확인한다면 size()보다 empty가 좋을것입니다.


(또한 size()==0)은 비교의 과정이 한번 더 들어가므로 이 보단 empty()로 한번에 해결함이 낫긴 할겁니다)




앞서 언급한바와 같이 현재는 size()가 상수시간입니다.


http://www.cplusplus.com/reference/list/list/size/



실제로 stl::list::size함수를 보면 다음과 같이 단순히 멤버변수를 반환하게 되어 있습니다.





하지만 splice를 함수의 헤더 정의 안으로 안으로 들어가면 


count에 대해 다음과 같은 연산을 하고 있습니다.




splice연산마다 새로 추가되는 원소가 몇개인지를


for을 통해 검사합니다.



이는 다시 말해 splice 연산에 있어 O(n)을 요구하게 됩니다.


왜냐하면 새로 추가되는 리스트의 부분이 몇개인지 알 수 없기때문에 


별 수 없이 검사를 하게 되기 때문입니다.


만약 위의 코드에서


else if (_First == _Right.begin() && _Last == _Right.end())

_Count = _Right._Mysize(); // splice in whole list


에 걸린다면 size를 위한 검사가 별도로 필요는 없을겁니다.

이러한 이유로 size()함수는 별도의 검사없이 splice에서 count를 검사하게 되어

항상 최신상태을 유지하게됩니다.

(insert함수도 살펴보면 for문을 돌며 원소를 한개씩 넣을때 마다 incsize함수를 통해 count를 최신화 합니다.



책에서의 논의는,

만약 splice가 count에 대한 별도처리가 없다면

splice에 대한 연산시간은 좀 더 짧아 지겠으나 반대 급부로 size()함수를 호출 할때 o(n)이 될거란 이야기를 하고 있습니다.

언제 원소가 줄어들고 늘어났는지 알 수 없기때문에 size는 항상 모든 노드를 검사한단 의미이죠.


하지만 c11에서는 모든 node operator에 대해 count를 검사하므로

size에 대해 고민없이 호출을 할 수 있습니다.


어쨋든 내부동작을 위해 글이 길어 졌으나 결론은 시간 복잡도는 empty나 size나 같으나

표현을 명확히 하고 싶다면 분명히 골라 함수를 써야한다는 점입니다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함