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

map插入自定義對象總結(jié)

 更新時間:2013年09月17日 10:08:01   作者:  
黑樹在插入節(jié)點時,必須依照大小比對之后在一個合適的位置上執(zhí)行插入動作。所以作為關(guān)鍵字,起碼必須有“<”這個比較操作符

難道插入map還有什么講究嗎?我們且看map在STL中的定義方法:
template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>
第一個參數(shù)Key是關(guān)鍵字類型
第二個參數(shù)T是值類型
第三個參數(shù)Compare是比較函數(shù)(仿函數(shù))
第四個參數(shù)是內(nèi)存配置對象

map內(nèi)部存儲機(jī)制實際是以紅黑樹為基礎(chǔ),紅黑樹在插入節(jié)點時,必須依照大小比對之后在一個合適的位置上執(zhí)行插入動作。所以作為關(guān)鍵字,起碼必須有“<”這個比較操作符。我們知道,int,float,enum,size_t等等簡單關(guān)鍵字,都有內(nèi)置的比較函數(shù),與map搭配無論是插入還是查找,都沒什么問題。但是作為復(fù)雜數(shù)據(jù)類型,如果沒有明確定義“<”比較操作符,就不能與map直接搭配使用,除非我們自己定義第三個參數(shù)。

在選擇map的關(guān)鍵字時,注意以下兩點,同時這兩點也是改錯的方法:
a) 關(guān)鍵字明確定義“<”比較操作符
b) 沒有“<”比較操作符,自定義仿函數(shù)替代第三個參數(shù)Compare,該仿函數(shù)實現(xiàn)“()”操作符,提供比較功能。插入時各節(jié)點順序以該仿函數(shù)為綱。

以std::pair為關(guān)鍵字摻入map
下面我們先寫一個有錯誤的函數(shù),在分析錯誤原因之后,逐步進(jìn)行修正。

復(fù)制代碼 代碼如下:

#include <map>

int main()
{
std::map<std::pair<int, int>, int> res;
       res.insert(std::make_pair(12,33), 33);
}

這個程序一定失敗,如果非要如此使用,上述a方法顯然不適合,std::pair是已定義好的結(jié)構(gòu)體不可修改。只能使用b方法了,定義一個比較類改造如下:
復(fù)制代碼 代碼如下:

#include <map>

struct comp
{
       typedef std::pair<int, int> value_type;
       bool operator () (const value_type & ls, const value_type &rs)
       {
              return ls.first < rs.first || (ls.first == rs.first && ls.second < rs.second);
       }
};

int main()
{
       std::map<std::pair<int, int>, int, comp> res;
       res.insert(std::make_pair(std::make_pair(12,33), 33));
       res.insert(std::make_pair(std::make_pair(121,331), 331));
       res.insert(std::make_pair(std::make_pair(122,332), 332));

       std::map<std::pair<int, int>, int, comp>::iterator it = res.find(std::make_pair(121,331));
       if (it == res.end())
              printf("NULL"n");
       else
              printf("%d %d %d "n", it->first.first, it->first.second, it->second);

    return 0;
}

以結(jié)構(gòu)體或類為關(guān)鍵字插入map
復(fù)制代碼 代碼如下:

#include <map>

struct st
{
       int a, b;

       st():a(0), b(0){}
       st(int x, int y):a(x), b(y){}
};

int main()
{
       std::map<struct st, int> res;
       res.insert(std::make_pair(st(1,2), 12));
       res.insert(std::make_pair(st(30,4), 34));
       res.insert(std::make_pair(st(5,6), 56));

       std::map<struct st, int>::iterator it = res.find(st(30,4));

       if (it == res.end())
              printf("NULL"n");
       else
              printf("first:%d second:%d %d"n", it->first.a, it->first.b, it->second);

       return 0;
}

編譯這個程序也是錯誤的,錯誤意思大概也是沒有定義“<”比較函數(shù)。因為struct st是我們自己定義的結(jié)構(gòu)體,所以修改這個程序可以使用上面a、b兩種方法。我們先談第一種,第一次修改時我也搞錯了,我是這樣定義比較函數(shù)的。
復(fù)制代碼 代碼如下:

struct st
{
       int a, b;

       st():a(0), b(0){}
       st(int x, int y):a(x), b(y){}
bool operator < (const struct st &rs) {return (this->a < rs.a || (this->a == rs.a && this->b < rs.b));}
};


按照這個改動再次編譯程序還是錯誤,有個如下這樣的提示:
/usr/include/c++/3.2.3/bits/stl_function.h:197: passing `const st' as `this' argument of `bool st::operator<(const st&)' discards qualifiers

為什么會出現(xiàn)這個問題呢?我們深入STL的源代碼看下。既然說是/usr/include/c++/3.2.3/bits/stl_function.h的197行出了問題,且看這行是什么。
復(fù)制代碼 代碼如下:

   193 /// One of the @link s20_3_3_comparisons comparison functors@endlink.
   194 template <class _Tp>
   195 struct less : public binary_function<_Tp,_Tp,bool>
   196 {
   197       bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }
   198 };

struct st中的“<”在編譯后真正是什么樣子呢?大概是bool operator < (struct st &ls, const struct st &rs)。在less調(diào)用這個比較符時,它都是以const方式傳入,不可能再以非const方式調(diào)用,故出錯。修正如下:
復(fù)制代碼 代碼如下:

struct st
{
       int a, b;

       st():a(0), b(0){}
       st(int x, int y):a(x), b(y){}
       friend bool operator < (const struct st &ls, const struct st &rs);
};
inline bool operator < (const struct st &ls, const struct st &rs)
{return (ls.a < rs.a || (ls.a == rs.a && ls.b < rs.b));}

以友聯(lián)函數(shù)代替函數(shù)內(nèi)部定義的比較操作符,STL內(nèi)部也多是以這種方式定義的。如果我非要以內(nèi)部定義的方式呢?可以使用b方法,我們自定義一個比較仿函數(shù),替代默認(rèn)的less。

插入函數(shù)返回值
在map容器中插入數(shù)據(jù)有很多函數(shù)可用,這里只討論最普通的insert操作,在STL中它是這樣定義的。
pair<iterator, bool> insert(const value_type& x);
map容器不允許鍵值重復(fù),在執(zhí)行插入操作后,可以憑借該返回值獲取操作結(jié)果。返回值是一個迭代器和布爾值的鍵值對,迭代器指向map中具有該值的元素,布爾值表示是否插入成功。如果布爾值為true,表示插入成功,則迭代器為新插入值在map中的位置;布爾值為false,表示插入失?。ㄒ呀?jīng)存在該值),迭代器為原有值在map中的位置。

相關(guān)文章

  • C 語言基礎(chǔ)教程(我的C之旅開始了)[三]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[三]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[三]...
    2007-02-02
  • C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[])

    C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[])

    這篇文章主要介紹了C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[]),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C++實現(xiàn)添加桌面右鍵新建菜單

    C++實現(xiàn)添加桌面右鍵新建菜單

    本文給大家匯總了3個版本的C++實現(xiàn)添加桌面右鍵新建菜單的代碼,陸陸續(xù)續(xù)寫的,有需要的小伙伴可以根據(jù)自己的需求來選擇
    2016-01-01
  • 一篇文章弄懂C++左值引用和右值引用

    一篇文章弄懂C++左值引用和右值引用

    左值(lvalue)和右值(rvalue)是 c/c++ 中一個比較晦澀基礎(chǔ)的概念,這篇文章主要給大家介紹了關(guān)于如何通過一篇文章弄懂C++左值引用和右值引用的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • 在matlab中實現(xiàn)for循環(huán)的方法

    在matlab中實現(xiàn)for循環(huán)的方法

    for循環(huán)用來循環(huán)處理數(shù)據(jù),break用于終止離它最近的一層for循環(huán),continue用于跳過離它最近的一層for循環(huán),接著執(zhí)行下一次循環(huán),本文重點給大家介紹在matlab中實現(xiàn)for循環(huán)的方法,感興趣的朋友一起看看吧
    2021-11-11
  • 教你用Matlab制作立體動態(tài)相冊

    教你用Matlab制作立體動態(tài)相冊

    沒想到吧,MATLAB竟也能制作3D相冊!本文將為大家詳細(xì)介紹Matlab制作立體動態(tài)相冊的方法步驟,感興趣的小伙伴可以跟隨小編一起動手試一試
    2022-03-03
  • C語言中的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換

    C語言中的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換

    這篇文章主要介紹了C語言中的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C語言之格式化屏幕輸出詳解

    C語言之格式化屏幕輸出詳解

    這篇文章主要介紹了C語言之格式化屏幕輸出的相關(guān)資料,需要的朋友可以參考下,小編覺得這篇文章寫的還不錯,希望能夠給你帶來幫助
    2021-11-11
  • Qt中connect()函數(shù)及用法詳解

    Qt中connect()函數(shù)及用法詳解

    connect() 函數(shù)就是Qt 框架中用于將信號(SIGNAL)和槽(SLOT)關(guān)聯(lián)起來的核心函數(shù),本文給大家介紹Qt中connect()函數(shù),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 一般函數(shù)指針和類的成員函數(shù)指針深入解析

    一般函數(shù)指針和類的成員函數(shù)指針深入解析

    以下是對一般函數(shù)指針和類的成員函數(shù)指針進(jìn)行了介紹。需要的朋友可以過來參考下
    2013-08-08

最新評論

温州市| 留坝县| 遂宁市| 酉阳| 左贡县| 麻江县| 晋宁县| 自治县| 平舆县| 鄂尔多斯市| 北辰区| 瓦房店市| 呼图壁县| 锡林郭勒盟| 延安市| 六安市| 南雄市| 天柱县| 当雄县| 西青区| 朝阳区| 永和县| 类乌齐县| 盐城市| 合水县| 铁岭市| 建平县| 苏尼特右旗| 长沙市| 贞丰县| 西宁市| 饶平县| 滕州市| 永济市| 红桥区| 南平市| 汪清县| 禄丰县| 鹿邑县| 陵水| 塔城市|