一、set的特性
所有元素都会根据元素的键值自动排序。set不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值
二、可以通过set的迭代器改变set的元素值吗?
不可以,因为set元素值就是其键值,关系到set元素的排列规则。如果任意改变set元素值,会严重破坏set组织。在set源代码中,set<T>::iterator被定义为底层红黑树的const_iterator,杜绝写入操作。换句话说set iterator是一种const iterators(相对于mutable iterators).
三、源码:typedef typename rep_type::const_iterator iterator;
iterator被定义为红黑树大的const_iterator,这表示set的迭代器无法执行写入操作,这是因为set的元素有一定的次序安排,不允许用户在任意处进行写入操作。
四、set使用的一定是红黑树的insert_unique()而非insert_equal(),multiset才使用红黑树的insert_equal(),因为set不允许相同的键值存在,multiset才允许相同键值存在
五、set拥有与list相同的某些性质:
当客户端对它进行元素新增操作(insert)或删除(erase)时,操作之前的所有迭代器,在操作完之后都依然有效,当然,被删除的那些元素的迭代器必然是个例外。在insert的时候,迭代器指向的是那个新增的结点
六、二叉搜索树
(1)、特点:任何结点的键值一定大于其左孩子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。因此从根节点一直往右走,直至无路可走,即得最大元素,从根节点一直往左走,直至无路可走,即得最小元素。
(2)删除:假定删除旧节点A,情况可分为两种,<1>如果A只有一个子节点,那么将A的子节点连接至A的父节点,并将A删除即可。如果A有两个子节点,那从A的右子树中找最小的节点取代A即可。(注意,右子树的最小节点极易获得:从右子树节点开始,(视右节点为根节点),一直向左走至底即是)
七、红黑树的迭代器属于双向迭代器,但不具备随机定位能力,它的操作和成员访问操作与list十分近似,红黑树迭代器的前进操作operator++()调用了基层迭代器的increament(),红黑树迭代器的后退操作operator—()则调用了基层迭代器的decreament()