關於set元素的不可直接更改

set的元素類型和比較函數(或者函數對象)是可以配置的,但是一旦配置就不能更改。

set的元素類型不可更改是很自然的,這本就是模板的天然含義。

set的比較函數雖然可以得到,但是得到的是copy,不是引用或者指針,所以不能修改(修改比較函數對象的參數)。

set裏面的元素不能直接的更改,一般的做法是先刪除舊元素,然後添加新元素,這當然是爲了維護裏面元素的有序性。

單獨的修改set的比較函數和元素數值,都有可能破壞set的有序性,從而破壞set的概念完整性,引起set的非預期行爲。但是,從一個特殊的角度看,如果同時修改set的比較函數和元素數值,而且還能保證set內部元素的有序性,這不會破壞set的概念完整性,也不會引起任何的非預期行爲。

我最近設計一個算法,正好發生在這種特殊的情況下,不得已只得修改STL的源碼生成新的類(我命名爲flexible_set),我覺得這是STL set類(也包括map,multiset,multimap)的一個缺陷。

概括起來,我得意思是:

1 修改比較函數

可以這樣得到set的比較函數
key_compare kc = set_obj.key_comp();
但是我想這樣得到
key_compare& kc = set_obj.key_comp();
然後調用kc的函數設置其參數。我說的修改比較函數就是這個意思

2 修改值

iterator it = set_obj.begin();

*it = 3;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章