developer tip

컨테이너 별 버전 대신 std :: begin 및 std :: end를 사용하는 경우

optionbox 2020. 9. 8. 07:53
반응형

컨테이너 별 버전 대신 std :: begin 및 std :: end를 사용하는 경우


말 대신 무료로 기능을 사용해야합니다 시작의 경우 컨테이너의 특정 버전을 설명하는 어떤 일반적인 환경 설정이나 규칙이 std::beginstd::end?

함수가 템플릿 인 경우 컨테이너 유형이 템플릿 매개 변수 인 경우 다음 std::begin과 같이 std::end사용해야합니다.

template<class T> void do_stuff( const T& t )
{
    std::for_each( std::begin(t), std::end(t), /* some stuff */ );
}

컨테이너 유형이 알려진 표준 / 멤버 함수와 같은 다른 시나리오에서는 어떻습니까? 더 나은 사용하는 연습을 여전히 std::begin(cont)하고 std::end(cont)또는 컨테이너의 멤버 함수해야 cont.begin()하고이 cont.end()선호는?

내가 호출하여 성능의 이점이 없다고 가정에서 수정 있습니까 cont.end()이상은 std::end(cont)?


당신이 보면,의 정의를 말한다 std::begin:

template< class C > 
auto begin( C& c ) -> decltype(c.begin());

begin()어쨌든 그것이하는 모든 것이 참조라는 것을 알 수 있습니다 . 나는 괜찮은 컴파일러가 차이를 만들지 않을 것이라고 생각하므로 선호도에 달려 있다고 생각합니다. 개인적으로 나는 그것을 사용 cont.begin()하고 cont.end()누구에게도 설명 할 필요가 없을 것입니다. :)

그러나 Mooing Duck이 지적했듯이 std::begin배열에서도 작동합니다.

template< class T, size_t N > 
T* begin( T (&array)[N] );

... 고려할 사항이 있습니다. 배열을 사용 하지 않는 경우 제 제안을 따르겠습니다. 무엇 전달되는 것은 STL 컨테이너, 또는 배열 될 것입니다 경우에 당신이 확실하지만 경우에 <T>다음 std::begin()가는 방법이다.


무료 함수 버전은 컨테이너의 멤버 함수보다 더 일반적입니다. 컨테이너의 유형이 사전에 알려지지 않은 일반 코드 (배열 일 수도 있음)에서 사용합니다. 나머지 코드에서는 (즉, 컨테이너가 고정되고 알려진 경우) 아마도 c.begin()관성으로 인해 사용할 것입니다 . 나는 C ++에 대한 새로운 교과서가 무료 기능 버전을 추천 할 것으로 기대하지만 (더 나쁘지 않고 때로는 더 좋기 때문에) 일반적인 사용을 따라 잡아야합니다.


디버깅을 위해 일부 최적화를 해제 cont.begin()하지 않는 한, 누군가가 정말 이상한 구현을 제공하지 않는 한 사용 (또는 첫 번째 요소에 대한 포인터 가져 오기 등)에 대한 성능 이점이 없습니다 ! 거의 모든 구현 (그리고 확실히 STL을 사용하는 구현)은 매우 얇고 컴파일러의 입에서 녹아 있습니다.

장점은 위의 "또는 무엇이든"에 있습니다. 동일한 코드가 STL의 다른 컬렉션 유형이든 배열이든, 또는 시작의 전문화를 제공 할 것으로 생각되는 타사의 기괴한 컬렉션이든 상관없이 다양한 컬렉션 유형에서 작동합니다. 그것을 사용하지 않더라도 begin()친숙 함의 이점이 있어야 할 정도로 잘 알려져 있습니다.

참고 URL : https://stackoverflow.com/questions/8452130/when-to-use-stdbegin-and-stdend-instead-of-container-specific-versions

반응형