C std set 出現重複元素

2021-10-22 02:21:53 字數 921 閱讀 8413

如題,今天自定義了乙個set的排序函式,重新構造了set,往裡插入元素的時候居然出現了重複元素!

首先set的比較函式含義是按照元素的出現頻率比較,高頻率的大於低頻率,如果二者頻率相等,則數值小的大於數值大的。

unordered_mapump;//統計元素頻率

struct cmp

};setmp;

void printmp()

; for(int & num : nums)

};

程式的執行結果如下:

1:1,

1:1, 2:1,

2:2, 1:1, 2:2,

2:2, 1:2, 2:2,

2:2, 1:2, 2:2, 3:1,

出現這個結果我思考了半天,首先懷疑了是不是自己定義的比較函式寫錯了,然而並沒有寫錯。那麼在這種比較函式中兩個元素是如何判斷等於的呢?簡單來說就是將比較函式的引數互換如果得到相同的結果,就會判斷為等於。放在set的實現中是不會將其插入的。

那麼問題出在**,就出在std::set的底層實現上,set的底層實現是紅黑樹,在判斷是不是存在重複元素的時候,是從根節點開始向下遍歷樹節點訪問的,如果向下訪問中訪問到了重複才不會插入,然而在我們的比較函式中,插入的時候1:1是比2:1要大的,也就是說2:1在1:1的左孩子上,而新加入的元素2:2是大於1:1的,因此紅黑樹新增到了1:1的右孩子節點,根本不會向左走去比較紅黑樹中已經存在的元素2,這時候set中就出現了重複元素。

如果更正以上**應該如下:

unordered_mapump;

struct cmp

};setmp;

void printmp()

; for(int & num : nums)

};

找重複元素

一道題目 乙個大小為n的整型陣列,值的範圍是1 n 1,其中有一對元素重複,問怎麼在o n 的時間複雜度下 不用o n 的空間複雜度來找出重複的那個值。這個題目最關鍵的應該是條件中的值的範圍,由於是1 n,所以用值作為下標可以遍歷從a 1 到a n 1 而元素值都是正數,那麼又可以在符號上動腦筋,當...

消除重複元素

程式設計題 消除重複元素 時間限制 1秒 空間限制 32768k 小易有乙個長度為n序列,小易想移除掉裡面的重複元素,但是小易想是對於每種元素保留最後出現的那個。小易遇到了困難,希望你來幫助他。輸入描述 輸入包括兩行 第一行為序列長度n 1 n 50 第二行為n個數sequence i 1 sequ...

存在重複元素

給定乙個整數陣列,判斷是否存在重複元素。如果任何值在陣列中出現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。示例 1 輸入 1,2,3,1 輸出 true 示例 2 輸入 1,2,3,4 輸出 false 示例 3 輸入 1,1,1,3,3,4,3,2,4,2 輸出 ...