2017-11-18 2 views
1
std::remove_copy 

template <class InputIterator, class OutputIterator, class T> 
OutputIterator remove_copy (InputIterator first, InputIterator last, 
           OutputIterator result, const T& val); 

복사 제거 범위 값, 발 동등 비교하는 요소 제외한 결과에서 시작하는 범위의 범위 [제 마지막)에서 복사 소자. 출력 컨테이너는 결과를 저장할만큼 충분히 커야합니다 ( ).STL의 표준 :

q1. 출력 컨테이너의 크기가 결과를 저장할만큼 커야하는 이유는 무엇입니까? 용기 자체가 자랄 건가요?

q2. remove_copy를 수행 할 때 출력 컨테이너의 이전 내용을 덮어 쓰는 이유는 무엇입니까? 예 : 수행 할 때 remove_copy(a.begin(),a.end(),b.begin(),' '); 컨테이너 B의 이전 내용이 손실되어 새로운 내용으로 바뀝니다. 이유는 무엇입니까? 출력 컨테이너의 시작 부분에 remove_copy의 결과가 추가되지 않는 이유는 무엇입니까?

+0

이 함수는 원시 배열뿐만 아니라 STL 컨테이너 클래스에서도 작동하도록 설계되었습니다. – user0042

+2

컨테이너를 확장하려면 ['std :: back_inserter'] (http://en.cppreference.com/w/cpp/iterator/back_inserter)를 사용하십시오. –

답변

3

출력 컨테이너의 크기가 결과를 보유 할만큼 충분히 커야하는 이유는 무엇입니까? 용기 자체가 자랄 건가요?

아니요. 어떻게 할 수 있습니까? 모든 알고리즘은 반복자이며 컨테이너의 구성원 함수 (컨테이너를 확장하는 데 필요함)에 반복자에서 액세스 할 수 없습니다. 그러나 컨테이너를 성장시키는 방법을 알고있는 특수 목적의 반복자가 있습니다. std::front_insert_iterator, std::back_insert_iteratorstd::insert_iterator이며 컨테이너에 대한 참조를 보유하고 참조 해제되고 할당 될 때마다 push_front, push_backinsert을 각각 호출합니다.

remove_copy를 수행 할 때 출력 컨테이너의 이전 내용을 덮어 쓰는 이유는 무엇입니까?

이것이 바로 알고리즘 작동 방식입니다. 그것이 모든 표준 라이브러리 알고리즘의 작동 방식입니다. 컨테이너에 대해서는 아무 것도 모릅니다. 모든 반복기가 컨테이너에서 제공되는 것은 아닙니다. 모든 컨테이너가 성장할 수있는 것은 아닙니다. 컨테이너에 추가하려면 위에서 설명한대로 std::back_insert_iterator을 사용하십시오. std::back_inserter 도우미 함수를 사용하여 템플릿 매개 변수를 지정하지 않고 편리하게 만들 수 있습니다.

std::remove_copy(source.begin(), source.end(), std::back_inserter(dest), value); 
0

출력 컨테이너의 크기가 결과를 보유 할만큼 충분히 커야하는 이유 : 예를 들면? 용기 자체가 자랄 건가요?

알고리즘은 시퀀스에서 작동합니다. 컨테이너는 시퀀스를 만드는 한 가지 방법이지만 유일한 방법은 아닙니다. 그렇습니다. 컨테이너는 끝에서 액세스 할 때마다 커지도록 작성 될 수 있지만 시퀀스는 일반적으로 그렇게하지 않습니다.

컨테이너가있는 경우 std::inserter을 사용하여 필요에 따라 컨테이너를 확장하는 출력 반복기를 만들 수 있습니다.

remove_copy를 수행 할 때 출력 컨테이너의 이전 내용을 덮어 쓰는 이유는 무엇입니까?

출력 반복기의 기능에 따라 다를 수도 있고 그렇지 않을 수도 있습니다. 컨테이너에 대한 반복자이고 insert_iterator가 아닌 경우 이미 존재하는 요소에만 액세스 할 수 있으므로 덮어 써야합니다. 출력 스트림에 대한 반복자라면 요소를 스트림에 씁니다. 아무것도 덮어 쓰지 않습니다.