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;