ldxcms

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

容器分类:(1)关联式容器:set、multiset、map和multimap;

             (2)序列式容器: vector、deque、list

关联式容器是有序容器,即数据插入容器中时,会按指定的排序准则找到插入位置;

序列式容器是可序容器,数据插入容器中,不保证是有序的,但可以调用sort使之有序。

 

自定义元素在上述两种容器中的排序:

现定义一个结构体元素:

     struct item{

                   int id;

                   int age;

         }

 

(1)对于关联式容器:

a. 以set为例,定义一个set<item>的容器,默认的是用less<item>来作为排序准则的,而   less<item>在底层会调用item的‘<’运算符,这就需要重载item的‘<’运算符,且必须是用友元函数的方式重载。

  

    set<item> itemSet;

    item i1,i2,i3;

    i1.id=2; i1.age=4;

    i2.id=3; i2.age=3;

    i3.id=1; i3.age=5;

    itemSet.insert(i1);  //error 提示不支持‘<’

        // 需要对item结构重载‘<’操作符

 

         则结构修改如下:

     struct item{

                   int id;

                   int age;

                  

                   bool operator<(const item& pr2)

                   {

                            return id<pr2.id;

                   }

         }

  再编译代码:仍然出错

  用友元函数方式重载:

         则结构修改如下:

     struct item{

                   int id;

                   int age;

                   friend bool operator<( const item& pr1,const item& pr2)

                   {

                            return pr1.id<pr2.id;

                   }

         }

  结果itemSet的值是按id从小到大排列的。

 

b.也可以不使用默认的排序准则less<item>,如可以用greater<item>,但这需要用友元的方式重载item的'>'运算符。

struct item{

                   int id;

                   int age;

                   friend bool operator>( const item& pr1,const item& pr2)

                   {

                            return pr1.id>pr2.id;

                   }

         }

c.也可以不使用系统提供的排序准则如less<item>和greater<item>,用自己定义的排序准则来排序。即用仿函数来实现。

class item_sort_rule{

public:

         bool operator()(const item & pr1,const item &pr2) const

         {

                   return (pr1.id<pr2.id);

         }

};

 

使用时这样: set<item,item_sort_rule> itemSet;

 

(2)对于序列式容器:

例如vector<item> itemVec;

要用sort函数进行排序

a.用sort(itemVec.begin, itemVec .end)形式,这种形式默认调用item的‘<’运算符。

所以需要重载item的‘<’运算符,不论是成员函数方式还是友元函数方式。

   struct item{

                   int id;

                   int age;

                   friend bool operator<( const item& pr1,const item& pr2)//友元函数形式

                   {

                            return pr1.id<pr2.id;

                   }

 

                   bool operator<(const item& pr) //成员函数形式

                   {

                            return id<pr.id;

                   }

 

         }

b.自己指定排序方法:

可以是普通函数;

bool itemsortrule(const item&  pr1,const item& pr2)

{

         return (pr1.id<pr2.id);

}

...

sort(itemVec.begin(),itemVec.end(),itemsortrule);

 

也可以是仿函数;

class item_sort_rule{

public:

         bool operator()(const item & pr1,const item &pr2) const

         {

                   return (pr1.id<pr2.id);

         }

};

 

sort(itemVec.begin(),itemVec.end(),item_sort_rule());

 

还可以是用标准库定义的greater<item>或less<item>,但这需要友元函数形式重载item的‘>’和'<'操作符

sort(itemVec.begin(),itemVec.end(),greater<item>());

 

(3)容器中存放的是元素的地址,如何按照元素值的大小排序

只能用普通函数方式或者仿函数方式

bool itemsortrule(const item*  pr1,const item* pr2)

{

         return pr1->id<pr2->id;

}

sort(m_ary.begin(),m_ary.end(),itemsortrule);

 

仿函数方式:

class item_sort_rule{

public:

         bool operator()(const item * pr1,const item *pr2) const

         {

                   return (pr1->id<pr2->id);

         }

};

 

sort(m_ary.begin(),m_ary.end(),item_sort_rule());

 

posted on 2014-04-25 15:20  ldxcms  阅读(522)  评论(0编辑  收藏  举报