国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

淺析stl序列容器(map和set)的仿函數排序

2020-01-26 15:49:54
字體:
來源:轉載
供稿:網友

問題:set是一個自動有序的集合容器,這是set的一個最實惠的性質,從小到大,只要你插入進去,就有序了。但是,如果你不想要這個順序呢,是不是可以人為控制set容器
的元素順序呢?答案是,可以的,因為stl也是程序員設計的。

首先看stl的模板構造函數

復制代碼 代碼如下:

explicit set ( const Compare& comp = Compare(), const Allocator& = Allocator() );
template
set ( InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator() );
set ( const set& x );

我們完全可以重定義set的構造函數里的比較函數,完成對set的自排序功能。

舉例:

復制代碼 代碼如下:

bool fncomp (int lhs, int rhs) {return lhs
struct classcomp {
bool operator() (const int& lhs, const int& rhs) const
{return lhs>rhs;} // 控制set逆序
};

void testset()
{
// 第一種使用方法
bool(*fn_pt)(int,int) = fncomp;
set sixth (fn_pt);
// 第二中使用方法
set s;                 // class as Compare
s.insert(4);
s.insert(5);
set::iterator it;
for(it=s.begin();it!=s.end();it++)
{
cout<<*it<<" ";
}
cout <<endl;
};


注意:如果set元素是一個結構體,你最好要設置你的仿函數,不然set一般默認是按第一個字段排序的,而我們的實際情況是想按序號i排序:
復制代碼 代碼如下:

struct ST_Message
{
public:
ST_Message(int seq, int64_t time, string strfrom, string strto, string strinfo){
this->seq=seq;this->time=time;this->strfrom=strfrom;this->strto=strto;this->strinfo=strinfo;}

int seq;
int64_t time;
string strfrom;
string strto;
string strinfo;

bool operator <(const ST_Message& other) const // 注意是const函數
{
if (seq != other.seq) // dtime按升序排序
{
return (seq < other.seq);
}
else if(time < other.time)
{
return (time < other.time);
}
else if(strcmp(strfrom.c_str(), other.strfrom.c_str()) != 0)
{
return (strcmp(strfrom.c_str(), other.strfrom.c_str()) < 0);
}
else if(strcmp(strto.c_str(), other.strto.c_str()) != 0)
{
return (strcmp(strto.c_str(), other.strto.c_str()) < 0);
}
else
{
return (strcmp(strinfo.c_str(), other.strinfo.c_str()) < 0);
}
}
};


stl中自動有序的容器map也和set有相同的應用,如果你想快速理解,那么把這篇文章中的set改成map就差不多了。

總之,有序的stl容器在工程中應用什么方便和廣泛,但是當我們需要自己的排序的時候,可以用仿函數來設置它!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 台前县| 大冶市| 同江市| 根河市| 务川| 容城县| 龙胜| 北川| 独山县| 靖安县| 汝南县| 和龙市| 孟津县| 灵丘县| 柳林县| 克拉玛依市| 衡阳市| 庆阳市| 合水县| 德钦县| 登封市| 石棉县| 桐城市| 桓台县| 郓城县| 含山县| 绥棱县| 肇庆市| 乌拉特中旗| 原阳县| 尼勒克县| 张家口市| 马龙县| 金塔县| 赣榆县| 读书| 阳江市| 浦城县| 屏东县| 云安县| 东乡|