亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

map插入自定義對象總結

2020-01-26 15:51:47
字體:
來源:轉載
供稿:網友

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

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

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

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

復制代碼 代碼如下:

#include <map>

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

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

#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;
}

以結構體或類為關鍵字插入map
復制代碼 代碼如下:

#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;
}

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

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

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

   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調用這個比較符時,它都是以const方式傳入,不可能再以非const方式調用,故出錯。修正如下:
復制代碼 代碼如下:

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));}

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品扒开腿做爽爽爽的视频| 亚洲免费一级电影| 国产亚洲欧美视频| 日韩在线观看网址| 中文字幕日韩精品在线| 国产精品自拍视频| 亚洲人成电影在线| 久久久久久久电影一区| 在线日韩精品视频| 97欧美精品一区二区三区| 亚洲国产精品成人一区二区| 日韩av在线免费看| 亚洲精品一区av在线播放| 91丨九色丨国产在线| 欧洲日本亚洲国产区| 久久精品视频va| 国产精品伦子伦免费视频| 欧美成人免费大片| 亚洲精品国产精品自产a区红杏吧| 成人免费福利视频| 日本三级久久久| 国产成人高清激情视频在线观看| 亚洲人成网7777777国产| 精品成人av一区| 黄色成人在线免费| 91国在线精品国内播放| 一区二区av在线| 国模精品视频一区二区| 日韩激情视频在线| 精品久久久久久久久久久久久| 亚洲综合成人婷婷小说| 久热精品视频在线免费观看| 亚洲女人被黑人巨大进入| 欧美日韩国产一中文字不卡| 中文字幕欧美日韩在线| 欧美午夜www高清视频| 欧美一区二区影院| 国产91精品青草社区| 日韩av日韩在线观看| 亚洲va久久久噜噜噜| 欧美极品美女电影一区| 成人免费福利视频| 欧美野外猛男的大粗鳮| 欧美俄罗斯乱妇| 亚洲色图15p| 欧美高清第一页| 欧美视频在线观看免费网址| 日韩av在线高清| 在线视频日本亚洲性| 九九久久久久久久久激情| 色悠悠久久久久| 亚洲国产精品网站| 2019中文字幕在线免费观看| 日韩亚洲欧美中文在线| 久久亚洲精品中文字幕冲田杏梨| 国产精品美女久久久久久免费| 国产一区二区三区在线观看网站| 久久99亚洲热视| 久久国产加勒比精品无码| 欧美日韩中文字幕综合视频| 亚洲精品福利资源站| 亚洲久久久久久久久久| 久久久久国色av免费观看性色| 久久久成人的性感天堂| 国产成人综合av| 欧美成人性色生活仑片| 亚洲人成77777在线观看网| 日韩大片免费观看视频播放| 午夜精品久久久久久久99黑人| 日本乱人伦a精品| 日韩av综合中文字幕| 亚洲美女视频网| 国产xxx69麻豆国语对白| 性色av一区二区三区红粉影视| 成人网在线观看| 日本成人在线视频网址| 欧美一区二区影院| 国产成人精品免高潮在线观看| 欧美激情一区二区三区高清视频| 精品国产户外野外| 欧洲亚洲女同hd| 国产欧美日韩免费| 日韩精品在线观看一区| 国产精品久久久av| 亚洲免费影视第一页| 久久久久久噜噜噜久久久精品| 最近免费中文字幕视频2019| 欧美日韩国产中文字幕| 国产精品夜间视频香蕉| 欧美精品一区二区免费| 亚洲欧美日本精品| 亚洲香蕉成人av网站在线观看| 91麻豆国产语对白在线观看| 国产亚洲精品成人av久久ww| 国产美女精品视频| 91精品久久久久久久久久久久久久| 91精品视频大全| 国产精品成人一区二区三区吃奶| 日韩精品一区二区视频| 久久国内精品一国内精品| 国产精品日韩专区| 色综合伊人色综合网| 欧美在线视频免费播放| 美女久久久久久久| 色樱桃影院亚洲精品影院| 97在线观看视频国产| 亚洲欧洲国产伦综合| 精品国产乱码久久久久久虫虫漫画| 日韩av在线网址| 欧美午夜视频在线观看| 91热福利电影| 91中文精品字幕在线视频| 亚洲激情 国产| 欧美肥老太性生活视频| 精品久久久久久久久国产字幕| 国产精品91免费在线| 欧美亚洲午夜视频在线观看| 国产精品视频26uuu| 国产亚洲精品va在线观看| 欧美黑人巨大精品一区二区| 大伊人狠狠躁夜夜躁av一区| 国产精品女主播视频| 97不卡在线视频| 亚洲视屏在线播放| 91精品久久久久久久久久久| 国产91对白在线播放| 亚洲天堂免费在线| 日本午夜精品理论片a级appf发布| 日韩美女视频免费看| 久久香蕉国产线看观看网| 国产精品免费视频xxxx| 国产成人亚洲综合青青| 日韩激情片免费| 日韩精品久久久久久久玫瑰园| 国外成人在线直播| 国产大片精品免费永久看nba| 91九色视频导航| 欧美日韩国产999| 上原亚衣av一区二区三区| 91精品国产色综合| 久久久久在线观看| 中文字幕在线看视频国产欧美| 亚洲精品自在久久| 日本三级久久久| 亚洲色图色老头| 精品久久香蕉国产线看观看gif| 亚洲色图美腿丝袜| 97视频人免费观看| 国产精品美女免费看| 久久精品99久久香蕉国产色戒| 亚洲精品视频久久| 久久久精品国产一区二区| 亚洲精品乱码久久久久久按摩观| 亚洲午夜女主播在线直播| 色婷婷综合久久久久中文字幕1| 国内精品免费午夜毛片| 欧美黑人极品猛少妇色xxxxx| 日韩在线视频线视频免费网站| 亚洲国语精品自产拍在线观看| 国产日产久久高清欧美一区| 亚洲精品98久久久久久中文字幕| 国产精品igao视频| 欧美性猛交视频| 国产精品免费观看在线|