2014-02-12 2 views
1

,표준 라이브러리가 컨테이너 제거 함수를 호출하는 이유는 무엇입니까? C++ 표준 라이브러리</em><em>에서

컨테이너 훨씬 더 나은 성능을 제공하는 멤버 함수가있을 수 있다고한다. SFINAE 같은 멤버 함수 (예를 들어, here)의 존재 여부를 검출 허용하는

std::erase 등이 존재하는 경우 그 컨테이너의 멤버 함수를 호출하는 물품은 너무 복잡이어야한다. 왜 그렇게하지 않습니까?

+0

대부분의 컨테이너에는'vector'와 같이 자체 erase()가 있습니다. – herohuyongtao

+0

'erase' 함수가 존재하지 않으면 어떻게해야합니까? – PlasmaHH

+0

@PlasmaHH 글쎄, 아무 것도 생각하지 못했습니다. – qdii

답변

6

표준 알고리즘은 컨테이너가 아닌 반복자 범위에서 작동합니다. 반복자를 감안할 때 컨테이너에서 오는 것인지 여부를 알 수있는 표준 방법은 없습니다. 컨테이너에 액세스 할 수있는 확실한 방법은 없습니다.

당신이 제안한 메타 프로그래밍을 지원하기 위해 반복기 요구 사항을 부풀게하는 것뿐만 아니라이를 지원하려면 각 반복기를 해당 컨테이너에 대한 포인터/참조로 부풀려 야합니다. 많은 경우 (보통 많은 iterator 타입이 하나의 포인터로 구현되기 때문에) 많은 비용이들 것입니다. (당신이 보통 어떤 타입의 컨테이너를 다루고 있는지 알기 때문에) 거의 필요하지 않은 최적화를 위해서입니다.

+0

단지 고가 일뿐만 아니라 종종 불가능합니다. 그리고 주어진 예제에서 의미론에 문제가있다 :'std :: remove'는'std :: set <> :: erase'와는 상당히 다른 의미를 가지고 있습니다 (예 :'std :: set <> :: erase 'std :: vector <> :: erase'와는 다른 인수를 취합니다). –

+1

@ JamesKanze : 실제로'지우기 '처럼 행동하는'remove'를 변경하는 것은 이상 할 것입니다. 더 나은 사용 사례는'std :: sort' 대'std :: list :: sort' 일 수도 있습니다. –