2014-01-11 2 views
0

첫 번째 요소 대신 순서대로 마지막 요소를 유지하면서 안정적인 정렬 된 벡터의 모든 복제본을 효율적으로 제거하려면 어떻게해야합니까?std :: unique 및 vector.erase를 사용하여 중복 요소의 마지막 항목을 모두 제거합니다

auto it = std::unique(vector.begin(), vector.end() ,[](string a, string b){ return ! (a.compare(b));}); 
vector.erase(it,vector.end()); 

하지만 마지막 중복 요소를 유지하면서 동일한 기능을 수행하는 방법을 잘 모르겠습니다 :

그것은 수행하여 첫 번째를 유지하기 위해 매우 간단합니다. 아마도 벡터의 끝에서부터 고유 한 검색 프로세스를 시작하는 역방향 반복기를 사용하여 수행 할 수 있지만 지우는 기능을 사용하여이를 결합하는 데 문제가 있습니다.

편집 : 정렬 방법을 수정하여 해결책을 찾았습니다. 이제 첫 번째 사본을 유지하면 충분합니다.

+0

'std :: unique'는 목표를 달성하기 위해'ForwardIterators'와'operator ++'를 사용합니다. 아주 간단한 구현 [여기] (http://www.cplusplus.com/reference/algorithm/unique/). 요소가 '평등'이라면 첫 번째 또는 마지막 항목을 삭제하면 왜 중요할까요? – Raja

+0

사용자 정의 맵 유형을 구현 중이며 동일한 키의 마지막 초기화 된 요소 만 유지하려고합니다. – Veritas

답변

2
auto it = std::unique(vector.rbegin(), vector.rend() ,[](string a, string b){ return ! (a.compare(b));}); 
vector.erase(vector.begin(),it.base()); 
+2

std :: erase는 매개 변수의 역방향 반복기를 허용하지 않습니다. – Veritas

+0

@Veritas 맞아. 나는 그것을 고쳤다. – sliser