set和multiset容器
1 set和multiset容器的能力
set 和multiset容器的内部结构通常由平衡二叉树(balancedbinary tree)来实现。当元素放入容器中时,会按照一定的排序法则自动排序,默认是按照less<>排序规则来排序。这种自动排序的特性加速了元素查找的过程,但是也带来了一个问题:不可以直接修改set或multiset容器中的元素值,因为这样做就可能违反了元素自动排序的规则。如果你希望修改一个元素的值,必须先删除原有的元素,再插入新的元素。
2 set和multiset容器的操作
Constructor and Destructor
#include <iostream>#include <set>#include "print.hpp"using namespace std; template <typename T>class RuntimeCmp { public: enum cmp_mode {normal,reverse}; private: cmp_mode mode; public: RuntimeCmp(cmp_mode m =normal) : mode(m) {} bool operator() (constT& t1, const T& t2) { returnmode == normal ? t1 < t2 : t1 > t2; } bool operator== (constT& rhv) { returnmode == rhv.mode; }}; typedef set<int, RuntimeCmp<int> > IntSet; //pre-declarevoid fill(IntSet& col1); int main(){ IntSet col1; fill(col1); PRINT_ELEMENTS(col1, "col1:"); RuntimeCmp<int>reverse_cmp(RuntimeCmp<int>::reverse); IntSet col2(reverse_cmp); fill(col2); PRINT_ELEMENTS(col2, "col2:"); if (col1 == col2) { cout << "col1and col2 is equal" <<endl; } else { if (col1 <col2) { cout<< "col1 is less than col2" << endl; } else { cout<< "col1 is greater than col2" << endl; } } return 0;} void fill(IntSet& col1) { col1.insert(2); col1.insert(3); col1.insert(6); col1.insert(5); col1.insert(1); col1.insert(4);}运行结果如下:col1 1 2 3 4 5 6 col2 6 5 4 3 2 1 col1 is less than col2这里例子中,col1和col2有着相同的类型:set<int,RuntimeCmp<int> >,但是它们的排序法则却不相同,一个升序,一个降序。这都是通过自定义的函数对象来实现的,所以函数对象比普通函数有着更加灵活与强大的控制,可以满足一些特殊的需求。