2010-07-15 11 views
0

Я искал эффективное решение для удаления дубликатов из списка C++.удаление дубликатов из списка C++

Список состоит из указателей на объект класса, который имеет идентификатор атрибута. Я хочу удалить дубликаты на основе этого идентификатора.

Для моей цели будет использоваться уникальный метод списка STL, в котором мы можем передать BinaryPredicate. т.е.

void unique (BinPred pr);

Я искал в Интернете, как использовать этот метод, n получил пример, в котором мы можем объявить функцию, возвращающую boolean, и использовать «имя» этой функции как двоичный предикат.

Но это не работает.

Что на самом деле это бинарный предикат и как его использовать? ... Любая помощь будет оценена по достоинству. Вот фрагмент кода:

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

Что значит «не работает»? Ошибка компиляции? Segfault? – SoapBox

+0

сообщение ** ваш ** код, является ли функция-член? какова область действия? –

ответ

0

Вы могли бы написать функцию, как:

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

Кроме того, возможно, придется объявить функцию как статические, если вы используете его в классе.

+0

да, я пробовал это делать. то я сделал mylist.unique (foo); , но компилятор говорит, что соответствующая функция не уникальна. –

+0

Я разместил исходный код выше. Статическая вещь говорит: «Невозможно объявить, что функция-член имеет статическую связь» –

+0

@Gaurav: 'static' должен появляться только в объявлении класса, а не при определении функции-члена вне класса. –

0

Вы должны использовать уникальный на упорядоченном списке. Итак, первое, что вам нужно сделать, это отсортировать список.

+0

при сортировке также у меня есть функция перегруженной сортировки, которая использует двоичный предикат. то, как я делаю сортировку: define boolean function, используйте это как двоичный предикат. Но это не сработает. Действительно ли это? mylist.sort (same_integral_part); i mean same_integral_part - это функция, и мы передаем ее как same_integral_part? –

Смежные вопросы