读书人

set跟multiset容器

发布时间: 2012-10-20 14:12:47 作者: rapoo

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> >,但是它们的排序法则却不相同,一个升序,一个降序。这都是通过自定义的函数对象来实现的,所以函数对象比普通函数有着更加灵活与强大的控制,可以满足一些特殊的需求。

读书人网 >编程

热点推荐