容器分类:(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());