2010-07-15 10 views
0

나는 C++ 목록에서 중복을 제거하는 효과적인 솔루션을 찾고있었습니다.C++ 목록에서 중복 제거

목록은 속성 ID가있는 클래스 객체에 대한 포인터로 구성됩니다. 해당 ID를 기반으로 중복을 제거하고 싶습니다.

내 목적으로 STL 목록의 고유 한 메서드가 작동하여 BinaryPredicate를 전달할 수 있습니다. 즉

void unique (BinPred pr);

이 방법을 사용하는 방법에 대해 인터넷에서 검색했습니다. n은 부울을 반환하는 함수를 선언하고이 함수의 "이름"을 이진 조건 자로 사용할 수있는 예제를 제공합니다.

하지만 작동하지 않습니다.

이 2 진 술어는 실제로 무엇이며 어떻게 사용합니까? ... 도움이 될 것입니다.

class SP_MDI_View { 
.. 
.. 
bool removeDupli(SP_DS_Node*, SP_DS_Node*); 
bool DoReductionGSPN(SP_DS_Node*, SP_ListNode*, SP_DS_Node*); 
.. 
.. 
} 
SP_MDI_View::DoReduction(...) { 
SP_ListNode setZ; // typedef list<SP_DS_Node*> SP_ListNode, where SP_DS_Node is some other class 
setZ.clear(); 
setZ.merge(tempsubset); 
setZ.merge(setX); 
setZ.push_back(*cs_iter); 
setZ.unique(removeDupli); //Error here 
} 
bool SP_MDI_View::removeDupli(SP_DS_Node* first, SP_DS_Node* second) { 
return ((first->GetId())==(second->GetId())); 
} 
+0

이것은 내가 이야기 한 예가있는 링크입니다. http://www.cplusplus.com/reference/stl/list/unique/ 이게 유효합니까? mylist.unique (same_integral_part); 제 컴파일러가 올바른 구문으로 사용하지 않습니다. –

+1

"작동하지 않는다"는 것은 무엇을 의미합니까? 컴파일 오류? 세고 폴트? – SoapBox

+0

** ** 귀하의 ** 코드는 회원 기능입니까? 범위가 뭐야? –

답변

0

당신은 같은 기능을 쓸 수있다 : 또한

bool foo (int first, int second) 
{ return (first)==(second)); } 

을, 당신은 당신이 클래스를 사용하는 경우 정적으로 함수를 선언해야 할 수도 있습니다.

+0

네, 해봤 어. 그 때 나는했다 mylist.unique (foo); 하지만 컴파일러는 고유 한 일치하는 함수가 없다고 말합니다. –

+0

위의 소스 코드를 게시했습니다. 정적 일은 "멤버 함수에 정적 링크가 있다고 선언 할 수 없다"라고 말합니다. –

+0

@Gaurav :'static'은 클래스 선언에 나타나야 만합니다. 클래스 밖에서 멤버 함수를 정의 할 때가 아닙니다. –

0

당신은 정렬 된 목록에 독특한 사용해야합니다 : 다음은 코드입니다. 따라서 가장 먼저해야 할 일은 목록을 정렬하는 것입니다.

+0

에 대한 호출과 일치하는 함수가 아닙니다. 또한 정렬하는 동안 오버로드 된 정렬 함수가 있습니다. 2 진 술어를 사용합니다. 정렬을 수행하는 방법은 다음과 같습니다. 부울 함수를 정의하고이를 이진 술어로 사용합니다. 그러나 그것은 효과가 없습니다. 이 유효합니까? mylist.sort (same_integral_part); same_integral_part가 함수이고 same_integral_part로 전달한다는 의미입니까? –