2010-07-15 254 views
0

我一直在寻找一种有效的解决方案,从C++列表中删除重复项。从C++列表中删除重复项

该列表由指针,其具有的属性ID的类对象的。我想删除基于该ID的重复项。

我的目的,STL的list的独特方法,将工作中,我们可以通过一个BinaryPredicate。即

空隙独特(BinPred PR);

我搜索有关如何使用此方法在互联网上,正得到中,我们可以声明函数返回布尔值,并使用该功能作为二元谓词的“名称”的一个例子。

但它不工作。

实际上这是什么二元谓词和如何使用它? ... 任何帮助将不胜感激。 这里是代码片段:

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); 我的编译器没有把它当作一个有效的语句。 – 2010-07-15 23:52:56

+1

你是什么意思“不工作”?编译错误?段错误? – SoapBox 2010-07-15 23:53:48

+0

发布**你的**代码,是一个成员函数吗?范围是什么? – 2010-07-16 00:04:21

回答

0

你可以写像一个函数:

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

此外,您可能需要您是否在课堂上用它来声明该函数为静态。

+0

是的,我试过这样做。然后我做了 mylist.unique(foo); 但编译器说没有唯一的匹配函数。 – 2010-07-15 23:59:21

+0

我已经发布了上面的源代码。静态事物说“不能声明成员函数具有静态链接” – 2010-07-16 00:18:49

+0

@Gaurav:'static'应该只出现在类声明中,而不是定义成员函数超出类。 – 2010-07-16 00:20:48

0

你有一个有序列表上使用独特。所以你必须做的第一件事是对列表进行排序。

+0

同时还排序,我有过载的排序函数,其使用二元谓词。我在做sort的方式是:定义一个布尔函数,将其用作二元谓词。但它不起作用。 这是有效的吗? mylist.sort(same_integral_part); 我的意思是same_integral_part是一个函数,我们将它作为same_integral_part传递? – 2010-07-15 23:58:12