我正在執行着名的「集合子集」問題。我想我有一個很好的工作解決方案,但它包含重複。我希望list.unique()會考慮到這種情況,但是因爲對於一個==操作符沒有定義,它不起作用。一套集合也不能解決這種情況(現在使用集合列表)。從列表中刪除重複項
有80%完整的解決方案,我意識到有一個更好的算法比我來。但我想知道是否有一個聰明的方法來刪除重複,而不完全重寫算法?
這裏是我的代碼:
main.cpp中:
#include "random.hpp"
using namespace std;
int main(void) {
subsets2();
getchar();
return 0;
}
Random.Cpp:
void getSubsets2(set<int> myset, list<set<int> > * ptr, int length) {
if (length == 1) {
ptr->push_back(myset);
}
else {
set<int> second(myset);
set<int>::iterator it;
ptr->push_back(myset);
it = myset.begin();
myset.erase(it);
it = second.begin();
++it;
second.erase(it);
getSubsets2(myset, ptr, length - 1);
getSubsets2(second, ptr, length - 1);
}
}
void subsets2(void) {
const int N = 4;
int myints[N] = {
88, 33, 23, 22
};
set<int> myset(myints, myints + N);
set<int> set2;
list<set<int> > mylist;
list<set<int> > * ptr;
ptr = & mylist;
list<set<int> > ::iterator it;
set<int>::iterator it2;
getSubsets2(myset, ptr, N);
mylist.unique();
for (it = mylist.begin(); it != mylist.end(); ++it) {
set2 = * it;
for (it2 = set2.begin(); it2 != set2.end(); ++it2) {
cout << * it2 << " ";
}
cout << "\n";
}
}
輸出:
22 23 33 88
23 33 88
33 88
88
33
23 88
88
23
22 33 88
33 88
88
33
22 88
88
22
還有一個'模板<類BinaryPredicate>無效獨特(BinaryPredicate binary_pred);'對列表定義。當然,唯一性只會刪除列表中的「下一個」元素。 – Yuushi
刪除重複項目聽起來像是一個bandaid以解決更嚴重的問題。爲什麼您的代碼首先創建重複項?這個問題的一個好的算法應該避免完全重複創建。 –