c++ - xlab - matlab plot number font size




size() 벡터에서 빈() 대-빈()이 선호되는 이유는 무엇입니까? (6)

뭔가를 디버깅하는 동안 STL vector :: empty () 구현을 보았습니다.

bool empty() const
        {return (size() == 0); }

나는 벡터의 공백을 조사 할 때마다 크기가 비어있는 것을 항상 사용하는 것이 좋습니다 (). 그러나 그 구현을보고, 나는 그렇게하고있는 것의 이점이 무엇인지 궁금하다. 대신 size () == 0을 내부적으로 호출 할 때 empty를 호출 할 때 함수 호출 오버 헤드가 있습니다.

나는 empty ()가 size ()가리스트에서 일정한 시간을 보장하지 않기 때문에리스트의 경우에 도움이 될 수 있다고 생각했다. 필자의 가정을 검증하기 위해 목록 구현을 점검하고 놀랍게도 같은 구현을 목록에서 찾았습니다.

return (size() == 0);

나는 지금 약간 혼란 스럽다. empty가 내부적으로 size ()를 사용한다면 size ()보다 empty를 선호해야하는 이유는 무엇입니까?


std :: vector에서 std :: list 또는 다른 컨테이너로 전환하면 다른 경우 일 수 있습니다.

예를 들어, std::list::size 의 일부 구현은 O(n) 취하고 O(1) 취하지 않습니다.


글쎄, 당신이 말했듯이, 그것은 단지 구현 세부 사항입니다. std::list 는 저장된 크기 (상수 시간 size() 이지만 선형 시간 splice() ) 또는없이 (일정 시간 splice() 하지만 선형 시간 size() ) 구현할 수 있습니다. empty() 를 사용하도록 선택하면 크기를 알 필요가 없을 때 구현 세부 사항에 베팅하는 것을 피할 수 있습니다.


위에 주어진 이유 외에도 foo.size () == 0 및! foo.size ()보다 더 논리적으로 명확합니다.


첫 번째로, empty() 라는 함수를 사용하면 무언가가 비어 있는지 여부를 알고 싶을 때 코드를 읽기 쉽도록 만들 수 있으며 구현 세부 사항에 대해 걱정할 필요가 없다는 것을 의미합니다. 또한 코드가 다른 유형의 컨테이너에 쉽게 적용될 수 있다는 것을 의미합니다.

둘째, 그것은 단지 하나의 STL 구현입니다. 제 GNU C ++은 다음과 같습니다 :

bool
empty() const
{ return begin() == end(); }

결과적으로 포인터 비교가되지만 size ()를 사용하면 빼기가 발생합니다 (이 구현에서).

셋째, empty() 함수가 인라인 될 가능성이 높으므로 (두 구현 모두에서 empty() 추가 함수 호출의 오버 헤드가 발생할 가능성은 거의 없습니다.


empty ()는 모든 컨테이너 클래스에 대해 O (1) 구현을가집니다. size ()는 일부 컨테이너에 대해서만 O (n) 구현을 제공 할 수 있습니다. 이것이 empty ()가 선호되는 이유입니다.


size ()보다 empty ()를 사용하는 것이 좋습니다. 왜냐하면 각 컨테이너는 일정 시간의 작업을 수행하기 위해 empty () 구현을 다른 방식으로 구현할 수 있기 때문입니다.

예:

vector implements as : bool empty () const {// 시퀀스가 ​​비어 있는지 테스트 return (size () == 0); }

목록은 다음과 같이 구현됩니다.

        bool empty() const
    {   // test if sequence is empty
    return (_Mysize == 0);
    }






size