欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何在C++中使用STL關(guān)聯(lián)式容器自定義排序規(guī)則-創(chuàng)新互聯(lián)

如何在C++中使用STL關(guān)聯(lián)式容器自定義排序規(guī)則?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有墨竹工卡免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

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


#include <iostream>
#include <set>  // set
#include <string>  // string
using namespace std;
//定義函數(shù)對象類
class cmp {
public:
 //重載 () 運(yùn)算符
 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/",
        "/tupian/20230522/www.net
        "/tupian/20230522/www.net
 //輸出容器中存儲的元素
 for (auto iter = myset.begin(); iter != myset.end(); ++iter) {
   cout << *iter << endl;
 }
 return 0;
}

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

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


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

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


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

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

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

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

表 1 C++ STL標(biāo)準(zhǔn)庫適用于關(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)降序排序,同樣適用于各個關(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ù)對象的方式實(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)式容器中存儲的數(shù)據(jù)類型為自定義的結(jié)構(gòu)體變量或者類對象時,通過對現(xiàn)有排序規(guī)則中所用的關(guān)系運(yùn)算符進(jìn)行重載,也能實(shí)現(xiàn)自定義排序規(guī)則的目的。


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

舉個例子:


#include <iostream>
#include <set>  // set
#include <string>  // string
using namespace std;
//自定義類
class myString {
public:
 //定義構(gòu)造函數(shù),向 myset 容器中添加元素時會用到
 myString(string tempStr) :str(tempStr) {};
 //獲取 str 私有對象,由于會被私有對象調(diào)用,因此該成員方法也必須為 const 類型
 string getStr() const;
private:
 string str;
};
string myString::getStr() const{
 return this->str;
}
//重載 < 運(yùn)算符,參數(shù)必須都為 const 類型
bool operator <(const myString &stra, const myString & strb) {
 //以字符串的長度為標(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 容器添加元素,這里會調(diào)用 myString 類的構(gòu)造函數(shù)
 myset.emplace("/tupian/20230522/www.net
 myset.emplace("/tupian/20230522/www.net
 myset.emplace("/tupian/20230522/www.net
 //
 for (auto iter = myset.begin(); iter != myset.end(); ++iter) {
  myString mystr = *iter;
  cout << mystr.getStr() << endl;
 }
 return 0;
}

程序執(zhí)行結(jié)果為:
/tupian/20230522/www.net myset 容器表面仍采用默認(rèn)的 std::less<T> 排序規(guī)則,但由于我們對其所用的 < 運(yùn)算符進(jìn)行了重載,使得 myset 容器內(nèi)部實(shí)則是以字符串的長度為基準(zhǔn),對各個 mystring 類對象進(jìn)行排序。

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


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

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

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


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

看完上述內(nèi)容,你們掌握如何在C++中使用STL關(guān)聯(lián)式容器自定義排序規(guī)則的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前文章:如何在C++中使用STL關(guān)聯(lián)式容器自定義排序規(guī)則-創(chuàng)新互聯(lián)
新聞來源:http://chinadenli.net/article16/eojgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站搜索引擎優(yōu)化網(wǎng)站內(nèi)鏈建站公司服務(wù)器托管標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)