最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ STL關(guān)聯(lián)式容器自定義排序規(guī)則的2種方法

 更新時(shí)間:2021年03月04日 14:47:00   投稿:zx  
這篇文章主要介紹了C++ STL關(guān)聯(lián)式容器自定義排序規(guī)則的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前面在講解如何創(chuàng)建 map、multimap、set 以及 multiset 容器時(shí),遺留了一個(gè)問(wèn)題,即如何自定義關(guān)聯(lián)式容器中的排序規(guī)則?
實(shí)際上,為關(guān)聯(lián)式容器自定義排序規(guī)則的方法,已經(jīng)在 《STL priority_queue自定義排序方法》一節(jié)中做了詳細(xì)的講解。換句話(huà)說(shuō),為 Priority_queue 容器適配器自定義排序規(guī)則的方法,同樣適用于所有關(guān)聯(lián)式容器。

總的來(lái)說(shuō),為關(guān)聯(lián)式容器自定義排序規(guī)則,有以下 2 種方法。

1) 使用函數(shù)對(duì)象自定義排序規(guī)則

在掌握此方法之前,讀者必須對(duì)函數(shù)對(duì)象有基本的了解,可閱讀《C++函數(shù)對(duì)象》一節(jié)。

無(wú)論關(guān)聯(lián)式容器中存儲(chǔ)的是基礎(chǔ)類(lèi)型(如 int、double、float 等)數(shù)據(jù),還是自定義的結(jié)構(gòu)體變量或類(lèi)對(duì)象(包括 string 類(lèi)),都可以使用函數(shù)對(duì)象的方式為該容器自定義排序規(guī)則。

下面樣例以 set 容器為例,演示了如何用函數(shù)對(duì)象的方式自定義排序規(guī)則:

#include <iostream>
#include <set>  // set
#include <string>  // string
using namespace std;
//定義函數(shù)對(duì)象類(lèi)
class cmp {
public:
 //重載 () 運(yùn)算符
 bool operator ()(const string &a,const string &b) {
  //按照字符串的長(zhǎng)度,做升序排序(即存儲(chǔ)的字符串從短到長(zhǎng))
  return (a.length() < b.length());
 }
};
int main() {
 //創(chuàng)建 set 容器,并使用自定義的 cmp 排序規(guī)則
 std::set<string, cmp>myset{"http://jb51.net.net/stl/",
        "http://jb51.net.net/python/",
        "http://jb51.net.net/java/"};
 //輸出容器中存儲(chǔ)的元素
 for (auto iter = myset.begin(); iter != myset.end(); ++iter) {
   cout << *iter << endl;
 }
 return 0;
}

程序執(zhí)行結(jié)果為:
http://jb51.net.net/stl/
http://jb51.net.net/java/
http://jb51.net.net/python/

重點(diǎn)分析一下 6~13 行代碼,其定義了一個(gè)函數(shù)對(duì)象類(lèi),并在其重載 () 運(yùn)算符的方法中自定義了新的排序規(guī)則,即按照字符串的長(zhǎng)度做升序排序。在此基礎(chǔ)上,程序第 17 行代碼中,通過(guò)將函數(shù)對(duì)象類(lèi)的類(lèi)名 cmp 通過(guò) set 類(lèi)模板的第 2 個(gè)參數(shù)傳遞給 myset 容器,該容器內(nèi)部排序數(shù)據(jù)的規(guī)則,就改為了以字符串的長(zhǎng)度為標(biāo)準(zhǔn)做升序排序。
需要注意的是,此程序中創(chuàng)建的 myset 容器,由于是以字符串的長(zhǎng)度為準(zhǔn)進(jìn)行排序,因此其無(wú)法存儲(chǔ)相同長(zhǎng)度的多個(gè)字符串。

另外,C++ 中的 struct 和 class 非常類(lèi)似(有關(guān)兩者區(qū)別,可閱讀《C++ struct和class到底有什么區(qū)別》一文),前者也可以包含成員變量和成員函數(shù)。因此上面程序中,函數(shù)對(duì)象類(lèi) cmp 也可以使用 struct 關(guān)鍵字創(chuàng)建:

//定義函數(shù)對(duì)象類(lèi)
struct cmp {
 //重載 () 運(yùn)算符
 bool operator ()(const string &a, const string &b) {
  //按照字符串的長(zhǎng)度,做升序排序(即存儲(chǔ)的字符串從短到長(zhǎng))
  return (a.length() < b.length());
 }
};

值得一提的是,在定義函數(shù)對(duì)象類(lèi)時(shí),也可以將其定義為模板類(lèi)。比如:

//定義函數(shù)對(duì)象模板類(lèi)
template <typename T>
class cmp {
public:
 //重載 () 運(yùn)算符
 bool operator ()(const T &a, const T &b) {
  //按照值的大小,做升序排序
  return a < b;
 }
};

注意,此方式必須保證 T 類(lèi)型元素可以直接使用關(guān)系運(yùn)算符(比如這里的 < 運(yùn)算符)做比較。

2) 重載關(guān)系運(yùn)算符實(shí)現(xiàn)自定義排序

其實(shí)在 STL 標(biāo)準(zhǔn)庫(kù)中,本就包含幾個(gè)可供關(guān)聯(lián)式容器使用的排序規(guī)則,如表 1 表示。

表 1 C++ STL標(biāo)準(zhǔn)庫(kù)適用于關(guān)聯(lián)式容器的排序規(guī)則

排序規(guī)則 功能
std::less<T>    底層采用 < 運(yùn)算符實(shí)現(xiàn)升序排序,各關(guān)聯(lián)式容器默認(rèn)采用的排序規(guī)則。
std::greater<T> 底層采用 > 運(yùn)算符實(shí)現(xiàn)降序排序,同樣適用于各個(gè)關(guān)聯(lián)式容器。
std::less_equal<T> 底層采用 <= 運(yùn)算符實(shí)現(xiàn)升序排序,多用于 multimap 和 multiset 容器。
std::greater_equal<T> 底層采用 >= 運(yùn)算符實(shí)現(xiàn)降序排序,多用于 multimap 和 multiset 容器。

值得一提的是,表 1 中的這些排序規(guī)則,其底層也是采用函數(shù)對(duì)象的方式實(shí)現(xiàn)的。以 std::less<T> 為例,其底層實(shí)現(xiàn)為:

template <typename T>
struct less {
 //定義新的排序規(guī)則
 bool operator()(const T &_lhs, const T &_rhs) const {
  return _lhs < _rhs;
 }
}

在此基礎(chǔ)上,當(dāng)關(guān)聯(lián)式容器中存儲(chǔ)的數(shù)據(jù)類(lèi)型為自定義的結(jié)構(gòu)體變量或者類(lèi)對(duì)象時(shí),通過(guò)對(duì)現(xiàn)有排序規(guī)則中所用的關(guān)系運(yùn)算符進(jìn)行重載,也能實(shí)現(xiàn)自定義排序規(guī)則的目的。

注意,當(dāng)關(guān)聯(lián)式容器中存儲(chǔ)的元素類(lèi)型為結(jié)構(gòu)體指針變量或者類(lèi)的指針對(duì)象時(shí),只能使用函數(shù)對(duì)象的方式自定義排序規(guī)則,此方法不再適用。

舉個(gè)例子:

#include <iostream>
#include <set>  // set
#include <string>  // string
using namespace std;
//自定義類(lèi)
class myString {
public:
 //定義構(gòu)造函數(shù),向 myset 容器中添加元素時(shí)會(huì)用到
 myString(string tempStr) :str(tempStr) {};
 //獲取 str 私有對(duì)象,由于會(huì)被私有對(duì)象調(diào)用,因此該成員方法也必須為 const 類(lèi)型
 string getStr() const;
private:
 string str;
};
string myString::getStr() const{
 return this->str;
}
//重載 < 運(yùn)算符,參數(shù)必須都為 const 類(lèi)型
bool operator <(const myString &stra, const myString & strb) {
 //以字符串的長(zhǎng)度為標(biāo)準(zhǔn)比較大小
 return stra.getStr().length() < strb.getStr().length();
}
int main() {
 //創(chuàng)建空 set 容器,仍使用默認(rèn)的 less<T> 排序規(guī)則
 std::set<myString>myset;
 //向 set 容器添加元素,這里會(huì)調(diào)用 myString 類(lèi)的構(gòu)造函數(shù)
 myset.emplace("http://jb51.net.net/stl/");
 myset.emplace("http://jb51.net.net/c/");
 myset.emplace("http://jb51.net.net/python/");
 //
 for (auto iter = myset.begin(); iter != myset.end(); ++iter) {
  myString mystr = *iter;
  cout << mystr.getStr() << endl;
 }
 return 0;
}

程序執(zhí)行結(jié)果為:
http://jb51.net.net/c/
http://jb51.net.net/stl/
http://jb51.net.net/python/

在這個(gè)程序中,雖然 myset 容器表面仍采用默認(rèn)的 std::less<T> 排序規(guī)則,但由于我們對(duì)其所用的 < 運(yùn)算符進(jìn)行了重載,使得 myset 容器內(nèi)部實(shí)則是以字符串的長(zhǎng)度為基準(zhǔn),對(duì)各個(gè) mystring 類(lèi)對(duì)象進(jìn)行排序。

另外,上面程序以全局函數(shù)的形式實(shí)現(xiàn)對(duì) < 運(yùn)算符的重載,還可以使用成員函數(shù)或者友元函數(shù)的形式實(shí)現(xiàn)。其中,當(dāng)以成員函數(shù)的方式重載 < 運(yùn)算符時(shí),該成員函數(shù)必須聲明為 const 類(lèi)型,且參數(shù)也必須為 const 類(lèi)型:

bool operator <(const myString & tempStr) const {
 //以字符串的長(zhǎng)度為標(biāo)準(zhǔn)比較大小
 return this->str.length() < tempStr.str.length();
}

至于參數(shù)的傳值方式是采用按引用傳遞還是按值傳遞,都可以(建議采用按引用傳遞,效率更高)。

同樣,如果以友元函數(shù)的方式重載 < 運(yùn)算符時(shí),要求參數(shù)必須使用 const 修飾:

//類(lèi)中友元函數(shù)的定義
friend bool operator <(const myString &a, const myString &b);
//類(lèi)外部友元函數(shù)的具體實(shí)現(xiàn)
bool operator <(const myString &stra, const myString &strb) {
 //以字符串的長(zhǎng)度為標(biāo)準(zhǔn)比較大小
 return stra.str.length() < strb.str.length();
}

當(dāng)然,本節(jié)所講自定義排序規(guī)則的方法并不僅僅適用于 set 容器,其它關(guān)聯(lián)式容器(map、multimap、multiset)也同樣適用,有興趣的讀者可自行編寫(xiě)代碼驗(yàn)證。

到此這篇關(guān)于C++ STL關(guān)聯(lián)式容器自定義排序規(guī)則的2種方法的文章就介紹到這了,更多相關(guān)C++ STL關(guān)聯(lián)式容器自定義排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言中雙鏈表的基本操作

    C語(yǔ)言中雙鏈表的基本操作

    這篇文章主要介紹了C語(yǔ)言中雙鏈表的基本操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++特殊成員詳解

    C++特殊成員詳解

    這篇文章主要為大家介紹了C++特殊成員,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++Fstream文件流與freopen重定向操作教程

    C++Fstream文件流與freopen重定向操作教程

    這篇文章主要介紹了C++Fstream文件流與freopen重定向教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • C語(yǔ)言中常用的幾個(gè)頭文件及庫(kù)函數(shù)

    C語(yǔ)言中常用的幾個(gè)頭文件及庫(kù)函數(shù)

    這篇文章主要介紹了C語(yǔ)言中常用的幾個(gè)頭文件及庫(kù)函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • c++字符串分割的方法

    c++字符串分割的方法

    這篇文章主要介紹了c++字符串分割的方法,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • c++制作的時(shí)間函數(shù)類(lèi)

    c++制作的時(shí)間函數(shù)類(lèi)

    本文給大家分享的是一個(gè)個(gè)人使用C++編寫(xiě)的時(shí)間函數(shù)類(lèi),主要是實(shí)現(xiàn)了類(lèi)的定義和調(diào)用,相比較來(lái)說(shuō)還算比較復(fù)雜的時(shí)間類(lèi)了,推薦給小伙伴們,有需要的朋友可以參考下。
    2015-03-03
  • Opencv實(shí)現(xiàn)聯(lián)合雙邊濾波

    Opencv實(shí)現(xiàn)聯(lián)合雙邊濾波

    這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)聯(lián)合雙邊濾波,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 浮點(diǎn)數(shù)在計(jì)算機(jī)中存儲(chǔ)方式是怎樣的

    浮點(diǎn)數(shù)在計(jì)算機(jī)中存儲(chǔ)方式是怎樣的

    這篇文章介紹了浮點(diǎn)數(shù)在計(jì)算機(jī)中是如何存儲(chǔ)的,講解的比較詳細(xì),有需要的朋友可以參考一下。
    2016-06-06
  • C++的內(nèi)聯(lián)函數(shù)你了解嗎

    C++的內(nèi)聯(lián)函數(shù)你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++的內(nèi)聯(lián)函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • c++基礎(chǔ)算法動(dòng)態(tài)DP解決CoinChange問(wèn)題

    c++基礎(chǔ)算法動(dòng)態(tài)DP解決CoinChange問(wèn)題

    這篇文章主要為大家介紹了c++基礎(chǔ)算法如何利用動(dòng)態(tài)DP來(lái)解決Coin Change的問(wèn)題示例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10

最新評(píng)論

获嘉县| 沭阳县| 淮北市| 仁化县| 尚志市| 察哈| 连南| 疏附县| 华坪县| 手机| 水富县| 江陵县| 临邑县| 绥滨县| 淳化县| 奉新县| 齐齐哈尔市| 任丘市| 昭觉县| 宝清县| 阿坝县| 顺义区| 佛山市| 石景山区| 荔波县| 东乌珠穆沁旗| 沿河| 八宿县| 霍林郭勒市| 赤水市| 舟山市| 错那县| 延庆县| 奉贤区| 河源市| 敖汉旗| 邻水| 盐池县| 二连浩特市| 巴林右旗| 九江市|