我很新C++(但知道我的方式圍繞C),所以我可能錯過了一些明顯的東西。C++設置:存儲重複項:關於<運算符
TLDR:我使用一個std :: set來儲存元素兩次,這絕對不是我想要的。
長的故事: 我已定義的類集團和我需要存儲這個類中的一組元素,所以我定義了<運營商派:
class Clique{
public :
int b;
int e;
int l;
std::set<int> X;
bool operator <(const Clique &rhs) const
{
if(b < rhs.b)
return true;
if(e < rhs.e)
return true;
if(X.size() < rhs.X.size())
return true;
std::set<int>::iterator itX = X.begin();
std::set<int>::iterator itrhs = rhs.X.begin();
// both sets have same size, need only to check end for one of them
while((*itX == *itrhs) && (itX != X.end())){
++itX;
++itrhs;
}
if(itX == X.end()){
//both sets are equal
return false;
}
else
return (*itX < *itrhs);
}
void print_clique(FILE *F) const ;
};
(我沒」確定如何設置比較完成,所以我寫了一個例程,首先按大小比較它們,然後逐個元素地進行比較)。
現在我想將Clique元素存儲在一個集合中,這就是問題出現的地方。 我的std :: set (1)似乎不按照我定義的順序存儲Clique元素; (2)存儲相同派
我已經寫了幾個拷貝打印一組桂系:
void print_cliqueset(std::set<Clique> mySet){
int setsize = 0;
std::set<Clique>::iterator it = mySet.begin();
Clique cur_c = *it;
Clique prev_c = *it;
while(it != mySet.end()){
// for(std::set<Clique>::iterator it = mySet.begin(); it != mySet.end(); ++it){
it->print_clique(stdout);
setsize ++;
++it;
if(it != mySet.end()){
cur_c = *it;
assert (prev_c < cur_c);
gassert(prev_c.b <= cur_c.b);
prev_c = *it;
}
}
assert(setsize == mySet.size());
}
我的功能比需要更多的複雜,但我想確保我的理解發生了什麼事。
這裏是印刷這樣的一組的一個典型輸出: 有用於每個派,其中我打印第一b,則e,然後在集合X
6829 9716 1 2 3 5 8 9 10
6792 9687 1 2 3 7 8 9 10
606 6531 1 2 3 5 6 7 8 9
6829 9687 1 2 3 5 7 8 9 10
410 9951 2 6
484 9805 1 2 4 6
494 9805 2 4 6 10
506 9805 1 2 5 6
484 9821 1 2 4
484 9871 2 3 4 6
506 9821 1 2 5
484 9802 1 2 3 4 6
486 9805 1 2 4 6 9
486 9802 1 2 3 4 6 9
507 9802 1 2 3 4 6 9 10
502 9802 1 2 3 4 6 10
506 9802 1 2 3 5 6
507 9806 1 2 4 9 10
507 9805 1 2 5 6 9
527 9806 1 2 5 9 10
元件由於我們的線可以看到,派系並沒有按照我定義的(或想要定義的)順序排序。他們應該首先由成員b(這是每行的第一行)排序,而事實並非如此。
然後我在輸出中有一些重複行(沒有出現在上面的例子中,但出現在完整的輸出中)。我想因爲它似乎混淆有關訂單的事實,我有重複並不奇怪...
我想答案是什麼很明顯的,但我看不到它。任何幫助,將不勝感激!
你使用哪種C++標準?解決方案的複雜性取決於此。 –
您的比較器需要遵循例如在*中指定的*等價關係*。 [這個'std :: set'參考](http://en.cppreference.com/w/cpp/container/set)。 –
順便說一句,成員'int l;'不作比較。 – Jarod42