亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

總的來說,為關聯式容器自定義排序規(guī)則,有以下 2 種方法。

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

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

無論關聯式容器中存儲的是基礎類型(如 int、double、float 等)數據,還是自定義的結構體變量或類對象(包括 string 類),都可以使用函數對象的方式為該容器自定義排序規(guī)則。

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

#include <iostream>
#include <set>  // set
#include <string>  // string
using namespace std;
//定義函數對象類
class cmp {
public:
 //重載 () 運算符
 bool operator ()(const string &a,const string &b) {
  //按照字符串的長度,做升序排序(即存儲的字符串從短到長)
  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/"};
 //輸出容器中存儲的元素
 for (auto iter = myset.begin(); iter != myset.end(); ++iter) {
   cout << *iter << endl;
 }
 return 0;
}

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

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

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

//定義函數對象類
struct cmp {
 //重載 () 運算符
 bool operator ()(const string &a, const string &b) {
  //按照字符串的長度,做升序排序(即存儲的字符串從短到長)
  return (a.length() < b.length());
 }
};

值得一提的是,在定義函數對象類時,也可以將其定義為模板類。比如:

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

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

2) 重載關系運算符實現自定義排序

其實在 STL 標準庫中,本就包含幾個可供關聯式容器使用的排序規(guī)則,如表 1 表示。

表 1 C++ STL標準庫適用于關聯式容器的排序規(guī)則

排序規(guī)則 功能
std::less<T>    底層采用 < 運算符實現升序排序,各關聯式容器默認采用的排序規(guī)則。
std::greater<T> 底層采用 > 運算符實現降序排序,同樣適用于各個關聯式容器。
std::less_equal<T> 底層采用 <= 運算符實現升序排序,多用于 multimap 和 multiset 容器。
std::greater_equal<T> 底層采用 >= 運算符實現降序排序,多用于 multimap 和 multiset 容器。

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

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

在此基礎上,當關聯式容器中存儲的數據類型為自定義的結構體變量或者類對象時,通過對現有排序規(guī)則中所用的關系運算符進行重載,也能實現自定義排序規(guī)則的目的。

注意,當關聯式容器中存儲的元素類型為結構體指針變量或者類的指針對象時,只能使用函數對象的方式自定義排序規(guī)則,此方法不再適用。

舉個例子:

#include <iostream>
#include <set>  // set
#include <string>  // string
using namespace std;
//自定義類
class myString {
public:
 //定義構造函數,向 myset 容器中添加元素時會用到
 myString(string tempStr) :str(tempStr) {};
 //獲取 str 私有對象,由于會被私有對象調用,因此該成員方法也必須為 const 類型
 string getStr() const;
private:
 string str;
};
string myString::getStr() const{
 return this->str;
}
//重載 < 運算符,參數必須都為 const 類型
bool operator <(const myString &stra, const myString & strb) {
 //以字符串的長度為標準比較大小
 return stra.getStr().length() < strb.getStr().length();
}
int main() {
 //創(chuàng)建空 set 容器,仍使用默認的 less<T> 排序規(guī)則
 std::set<myString>myset;
 //向 set 容器添加元素,這里會調用 myString 類的構造函數
 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í)行結果為:
http://jb51.net.net/c/
http://jb51.net.net/stl/
http://jb51.net.net/python/

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

另外,上面程序以全局函數的形式實現對 < 運算符的重載,還可以使用成員函數或者友元函數的形式實現。其中,當以成員函數的方式重載 < 運算符時,該成員函數必須聲明為 const 類型,且參數也必須為 const 類型:

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

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

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

//類中友元函數的定義
friend bool operator <(const myString &a, const myString &b);
//類外部友元函數的具體實現
bool operator <(const myString &stra, const myString &strb) {
 //以字符串的長度為標準比較大小
 return stra.str.length() < strb.str.length();
}

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

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

相關文章

  • C++模板全方位深入解讀

    C++模板全方位深入解讀

    人們需要編寫多個形式和功能都相似的函數,因此有了函數模板來減少重復勞動;人們也需要編寫多個形式和功能都相似的類,于是?C++?引人了類模板的概念,編譯器從類模板可以自動生成多個類,避免了程序員的重復勞動
    2022-06-06
  • C/C++中退出線程的四種解決方法

    C/C++中退出線程的四種解決方法

    本篇文章是對C/C++中退出線程的四種解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言算法練習之打魚還是曬網

    C語言算法練習之打魚還是曬網

    這篇文章主要該大家分享C語言打魚還是曬網的練習,文章主要通過三天打魚兩天曬網的俗語提出問題,在某一天輪到打魚還是曬網,下面來看詳細內容吧,需要的朋友可以參考一下
    2022-03-03
  • C/C++實現獲取硬盤序列號的示例代碼

    C/C++實現獲取硬盤序列號的示例代碼

    獲取硬盤的序列號、型號和固件版本號,此類功能通常用于做硬盤綁定或硬件驗證操作,下面我們就來學習一下如何使用C/C++實現獲取硬盤序列號吧
    2023-11-11
  • OpenCV實現簡單套索工具

    OpenCV實現簡單套索工具

    這篇文章主要為大家詳細介紹了OpenCV實現簡單套索工具,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 關于VS2019 C++項目同時出現LNK2005 和LNK1169 error 的解決辦法

    關于VS2019 C++項目同時出現LNK2005 和LNK1169 error 的解決辦法

    這篇文章主要介紹了關于VS2019 C++項目同時出現LNK2005 和LNK1169 error 的解決辦法,本文給大家介紹的非常詳細,對大家的學習工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 關于python調用c++動態(tài)庫dll時的參數傳遞問題

    關于python調用c++動態(tài)庫dll時的參數傳遞問題

    這篇文章主要介紹了python調用c++動態(tài)庫dll時的參數傳遞,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 淺析C++中結構體的定義、初始化和引用

    淺析C++中結構體的定義、初始化和引用

    以下是對C++中結構體的定義、初始化和引用進行了詳細的介紹,需要的朋友可以過來參考下
    2013-09-09
  • c++讀取數據文件到數組的實例

    c++讀取數據文件到數組的實例

    今天小編就為大家分享一篇c++讀取數據文件到數組的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C++實現猜數游戲

    C++實現猜數游戲

    這篇文章主要為大家詳細介紹了C++實現猜數游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評論