,표준 라이브러리가 컨테이너 제거 함수를 호출하는 이유는 무엇입니까? C++ 표준 라이브러리</em><em>에서
컨테이너 훨씬 더 나은 성능을 제공하는 멤버 함수가있을 수 있다고한다. SFINAE 같은 멤버 함수 (예를 들어, here)의 존재 여부를 검출 허용하는
std::erase
등이 존재하는 경우 그 컨테이너의 멤버 함수를 호출하는 물품은 너무 복잡이어야한다. 왜 그렇게하지 않습니까?
,표준 라이브러리가 컨테이너 제거 함수를 호출하는 이유는 무엇입니까? C++ 표준 라이브러리</em><em>에서
컨테이너 훨씬 더 나은 성능을 제공하는 멤버 함수가있을 수 있다고한다. SFINAE 같은 멤버 함수 (예를 들어, here)의 존재 여부를 검출 허용하는
std::erase
등이 존재하는 경우 그 컨테이너의 멤버 함수를 호출하는 물품은 너무 복잡이어야한다. 왜 그렇게하지 않습니까?
표준 알고리즘은 컨테이너가 아닌 반복자 범위에서 작동합니다. 반복자를 감안할 때 컨테이너에서 오는 것인지 여부를 알 수있는 표준 방법은 없습니다. 컨테이너에 액세스 할 수있는 확실한 방법은 없습니다.
당신이 제안한 메타 프로그래밍을 지원하기 위해 반복기 요구 사항을 부풀게하는 것뿐만 아니라이를 지원하려면 각 반복기를 해당 컨테이너에 대한 포인터/참조로 부풀려 야합니다. 많은 경우 (보통 많은 iterator 타입이 하나의 포인터로 구현되기 때문에) 많은 비용이들 것입니다. (당신이 보통 어떤 타입의 컨테이너를 다루고 있는지 알기 때문에) 거의 필요하지 않은 최적화를 위해서입니다.
단지 고가 일뿐만 아니라 종종 불가능합니다. 그리고 주어진 예제에서 의미론에 문제가있다 :'std :: remove'는'std :: set <> :: erase'와는 상당히 다른 의미를 가지고 있습니다 (예 :'std :: set <> :: erase 'std :: vector <> :: erase'와는 다른 인수를 취합니다). –
@ JamesKanze : 실제로'지우기 '처럼 행동하는'remove'를 변경하는 것은 이상 할 것입니다. 더 나은 사용 사례는'std :: sort' 대'std :: list :: sort' 일 수도 있습니다. –
대부분의 컨테이너에는'vector'와 같이 자체 erase()가 있습니다. – herohuyongtao
'erase' 함수가 존재하지 않으면 어떻게해야합니까? – PlasmaHH
@PlasmaHH 글쎄, 아무 것도 생각하지 못했습니다. – qdii