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

C++中地圖按鍵排序?qū)崿F(xiàn)示例

 更新時間:2022年07月20日 17:15:28   作者:吳欣  
這篇文章主要為大家介紹了C++中地圖按鍵排序?qū)崿F(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

一個地圖由鍵/值對組成。每一對都是一個元素。一個地圖中的所有鍵都是唯一的。一個地圖可以按鍵進行排序。排序可以是升序或降序。升序是默認的。地圖中的排序并不總是直接的。它需要一個比較函數(shù)對象。如果比較對象被忽略了,就會發(fā)生默認的排序。

如果鍵是恒定的指向字符的指針,地圖就會按鍵的指針排序,而不是按鍵的字符串字數(shù)排序。這幾乎不是任何人想要的??紤]以下水果的鍵/值對和它們的外部顏色。

    "plum" => "purple"
    "blackberry" => "dark blue-black"
    "watermelon" => "green"
    "apricot", => "orange"
     "papaya" => "orange"
    "banana" => "yellow"

水果是鍵,而顏色是值。這個元素列表(鍵/值對)是沒有排序的。下面的程序創(chuàng)建了這個列表的映射,并按原樣顯示,沒有按字符串字面排序。

 #include <iostream>
    #include <map>
    using namespace std;
    int main()
    {
        map<const char*, const char*> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        for (map<const char*, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

輸出結(jié)果是:

 plum => purple
    blackberry => dark blue-black
    watermelon => green
    apricot => orange
    papaya => orange
    banana => yellow

未按字符串字面排序,但按指針排序。要在C++程序中使用地圖,必須用include指令來包含地圖庫。

創(chuàng)建上述簡單地圖的另一種方法是如下。

 #include <iostream>
    #include <map>
    using namespace std;
    int main()
    {
        map<const char*, const char*> mp({{"plum","purple"}, {"blackberry","dark blue-black"}, {"watermelon","green"}, {"apricot","orange"}, {"papaya","orange"}, {"banana","yellow"}});
        for (map<const char*, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

輸出結(jié)果是:

 plum => purple
    blackberry => dark blue-black
    watermelon => green
    apricot => orange
    papaya => orange
    banana => yellow

未按字符串字面排序,但按指針排序。如果鍵值是整數(shù),輸出將按鍵值排序。在實踐中,許多地圖的鍵是字符串字面。這篇文章解釋了字符串字面的鍵是如何對地圖進行排序的。

創(chuàng)建過程中的排序

構(gòu)建地圖的完整模板是:

template<class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key, T>>> class map;

類,Compare和Allocator,有默認值。也就是說,它們有默認的專業(yè)化,不必在map聲明(實例化)中進行類型化。這里要關(guān)注的是比較類。這個類的名字是Compare,默認的特殊化是 "less"。"less<Key "意味著按升序排序。另一個選項是 "greater",意思是降序排序。

一個地圖在創(chuàng)建時通常是按鍵值排序的。如果鍵是const char*,那么指向引號字面字符串的指針將被排序,而不是字面文本。要在創(chuàng)建過程中把字符串作為鍵進行排序,字符串必須是由字符串類實例化的字符串對象的字面意思。這意味著必須包括字符串庫和地圖庫。

創(chuàng)建升序

在下面的程序中,地圖被創(chuàng)建,升序排序。

 #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*, less<string>> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        for (map<string, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

輸出結(jié)果是:

apricot => orange
    banana => yellow
    blackberry => dark blue-black
    papaya => orange
    plum => purple
    watermelon => green

即使模板中省略了less,排序仍然會是升序的,因為less是默認的。

創(chuàng)建降序

為了創(chuàng)建一個地圖,使其按鍵的降序排序,必須對比較專業(yè)化進行編碼。下面的程序說明了這一點。

 #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*, greater<string>> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        for (map<string, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

輸出結(jié)果是:

 watermelon => green
    plum => purple
    papaya => orange
    blackberry => dark blue-black
    banana => yellow
    apricot => orange

生成一個范圍的降序

一個地圖的范圍可以按降序產(chǎn)生。這涉及到創(chuàng)建第二個地圖,它是第一個地圖的一個范圍。下面的程序說明了這一點。

 #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        map<string, const char*>::iterator itB = mp.begin();
        itB++;
        map<string, const char*>::iterator itE = mp.end();
        itE--;
        map<string, const char*, greater<string>> mpR(itB, itE);
        for (map<string, const char*>::iterator it = mpR.begin(); it != mpR.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

輸出結(jié)果是:

 plum => purple
    papaya => orange
    blackberry => dark blue-black
    banana => yellow

第一個地圖對象有六個元素,分別是

apricot => orange
    banana => yellow
    blackberry => dark blue-black
    papaya => orange
    plum => purple
    watermelon => green

考慮的范圍是:

 banana => yellow
    blackberry => dark blue-black
    papaya => orange
    plum => purple
    watermelon => green

在代碼中,"itB++"指向{"香蕉","黃色"},"itE-"指向{"西瓜","綠色"}的范圍。在C++中處理一個范圍時,最后一個元素不參與操作。于是,輸出有四個元素,{"西瓜","綠"}被省略了。

第二個map的Compare模板參數(shù)的特化是 greater。如果它是less或者省略,那么這個范圍會導致升序。

通過鍵比較兩個元素

key_compare key_comp() const

這個成員函數(shù)返回map容器用來比較鍵的比較對象的副本。比較對象是一個函數(shù)對象。它將把兩個鍵作為參數(shù),如果左鍵小于右鍵,則返回真。有了這個,代碼段應該是。

 key_compare kc = mp.key_comp();
 bool bl = kc("watermelon", "apricot");

key_compare不被編譯器識別。在這個代碼段中消除key_compare,在第二條語句中替換掉kc,結(jié)果是。

bool bl = mp.key_comp()("watermelon", "apricot");

下面的程序說明了key_comp()的使用。

#include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        bool bl = mp.key_comp()("watermelon", "apricot");
        cout << bl << endl;
        return 0;
    }

輸出結(jié)果是0,表示錯誤。

上述代碼段的真正問題是,key_compare的命名空間沒有得到很好的表達。如果這段代碼是

 map<string, const char*>::key_compare kc = mp.key_comp();
 bool bl = kc("watermelon", "apricot");

它本來可以工作(被編譯器接受)。

value_compare value_comp() const

這個成員函數(shù)與key_comp()類似。注意:這里指的不是鍵/值對的值,而是鍵/值對的元素。所以,value_compare函數(shù)對象的兩個參數(shù)是迭代器元素。下面的程序使用value_comp(),在比較第一個和最后一個元素,{"杏","橙"}和{"西瓜","綠"}:

    #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    int main()
    {
        map<string, const char*, less<string>> mp;
        mp["plum"] = "purple";
        mp["blackberry"] = "dark blue-black";
        mp["watermelon"] = "green";
        mp["apricot"] = "orange";
        mp["papaya"] = "orange";
        mp["banana"] = "yellow";
        map<string, const char*>::iterator itB = mp.begin();
        map<string, const char*>::iterator itE = mp.end();
        itE--;
        map<string, const char*>::value_compare vc = mp.value_comp();
        bool bl = vc(*itB, *itE);
        cout << bl << endl;
        return 0;
    }

輸出是1,表示真。迭代器itB和itE被解讀為有它們的元素,用的是嵌套運算符。

對用初始化器列表創(chuàng)建的地圖進行排序

在下面的程序中,排序是降序的,鍵是字符串對象,從字符串類實例化出來。

    #include <iostream>
    #include <string>
    #include <map>
    using namespace std;
    int main()
    {
        map<string, const char*, greater<string>> mp({{"plum","purple"}, {"blackberry","dark blue-black"}, {"watermelon","green"}, {"apricot","orange"}, {"papaya","orange"}, {"banana","yellow"}});
        for (map<string, const char*>::iterator it = mp.begin(); it != mp.end(); it++)
            cout << it->first << " => " << it->second << endl;
        return 0;
    }

輸出結(jié)果是。

    watermelon => green
    plum => purple
    papaya => orange
    blackberry => dark blue-black
    banana => yellow
    apricot => orange

結(jié)論

一個地圖的創(chuàng)建是按照鍵來排序的,升序。升序是默認的順序。要想讓它降序,請在模板參數(shù)列表中加入模板參數(shù)的特殊化,即作為第三個參數(shù)的大號。注意:如果鍵值是字符串,它們必須從字符串類中實例化出來,如上圖所示。作為const-char*或char-arr[]的字符串鍵,其指針最終會被排序,而不是其字面意義。

以上就是C++中地圖按鍵排序?qū)崿F(xiàn)示例的詳細內(nèi)容,更多關(guān)于C++地圖按鍵排序的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++string中的insert()插入函數(shù)詳解

    C++string中的insert()插入函數(shù)詳解

    這篇文章主要介紹了C++string中的insert()插入函數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C語言中二級指針解析(指向指針的指針)

    C語言中二級指針解析(指向指針的指針)

    這篇文章主要介紹了C語言中二級指針(指向指針的指針),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • OpenCV 視頻中火焰檢測識別實踐

    OpenCV 視頻中火焰檢測識別實踐

    本文主要介紹了OpenCV 視頻中火焰檢測識別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++中Boost的智能指針shared_ptr

    C++中Boost的智能指針shared_ptr

    這篇文章介紹了C++中Boost的智能指針shared_ptr,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C++實現(xiàn)簡單的希爾排序Shell Sort實例

    C++實現(xiàn)簡單的希爾排序Shell Sort實例

    這篇文章主要介紹了C++實現(xiàn)簡單的希爾排序Shell Sort實例,對于正在學習算法的朋友很有借鑒價值,需要的朋友可以參考下
    2014-07-07
  • C++11?constexpr使用詳解

    C++11?constexpr使用詳解

    constexpr是一種比const?更嚴格的束縛,?它修飾的表達式本身在編譯期間可知,?并且編譯器會盡可能的?evaluate?at?compile?time,本文重點給大家介紹C++11?constexpr使用,需要的朋友可以參考下
    2021-12-12
  • c++如何實現(xiàn)歸并兩個有序鏈表

    c++如何實現(xiàn)歸并兩個有序鏈表

    這篇文章主要介紹了c++如何實現(xiàn)歸并兩個有序鏈表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C/C++編譯報錯printf was not declared in this scope問題及解決

    C/C++編譯報錯printf was not declared in 

    這篇文章主要介紹了C/C++編譯報錯printf was not declared in this scope問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言之直接插入排序算法的方法

    C語言之直接插入排序算法的方法

    這篇文章主要為大家介紹了C語言直接插入排序算法的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • QT打包發(fā)布全流程(圖文教程)

    QT打包發(fā)布全流程(圖文教程)

    本文主要介紹了QT打包發(fā)布全流程,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07

最新評論

嘉祥县| 乐安县| 卫辉市| 蕉岭县| 芜湖市| 古田县| 靖安县| 克山县| 民乐县| 太康县| 鹤山市| 宣化县| 灌阳县| 双流县| 惠州市| 通渭县| 石景山区| 福清市| 洛扎县| 米泉市| 炉霍县| 青川县| 皋兰县| 南皮县| 封开县| 奉新县| 弥勒县| 沧源| 泰和县| 兴文县| 敦煌市| 阳新县| 偃师市| 台湾省| 蒙自县| 正镶白旗| 甘孜县| 简阳市| 绵阳市| 田东县| 庆元县|