日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL之红黑树容器:set,hash_set,multiset,hash_map,multimap

發布時間:2024/9/27 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL之红黑树容器:set,hash_set,multiset,hash_map,multimap 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1紅黑樹set(不能包含重復元素)

案例1:紅黑樹容器set,插入,查找

#include<iostream>

#include<set>

usingnamespacestd;

?

//set中不能有重復的元素,它是一個紅黑樹容器

voidmain()

{

???set<int>myset;

???myset.insert(10);

???myset.insert(9);

???myset.insert(8);

???myset.insert(7);

???myset.insert(5);

???myset.insert(5);

???myset.insert(6);

???myset.insert(7);

???//myset.insert(7);重復會被舍棄

???autofindpos =myset.find(10);

???cout <<" find -> " << *findpos << " \n";

?

???autoib =myset.begin();

???autoie =myset.end();

???for (;ib !=ie;ib++)

???{

???????cout << *ib << "??";

???}

???cout <<"\n" <<myset.size() << endl;

???cin.get();

}

?

案例2

#include<iostream>

#include<set>

?

usingnamespacestd;

?

structstrless

{

???//二分查找法依賴于有序,字符串有序

???bool operator()(constchar *str1,constchar *str2)//二分查找法依賴于有序,字符串有序

???{

???????returnstrcmp(str1,str2) < 0;

???}

};

?

//紅黑樹,處理純數字非常少,經常處理類對象以及字符串

voidmain()

{

???constchar *cmd[] = { "abc","calc","notepad","const","xyz","ghj" };

???//strless():表示比大小的

???//set是一個紅黑樹,不可以用下標的方式

???set<constchar*,strless>myset(cmd,cmd + 6,strless());

???myset.insert("1234");

???myset.insert("4567");

?

???//pair起到獲取插入返回值,第一個類型,類型比大小的方式

???//pair相當于是一對的意思,同時可以裝兩個東西

???pair<set<constchar *>::iterator,bool>p =myset.insert("9876");

???cout <<"pair start" <<endl;

???cout << *(p.first) << " " <<p.second << endl;

???cout <<"pair over" <<endl;

???cout <<"----正向迭代---" << endl;

?

???autoib =myset.begin();

???autoie =myset.end();

???for (;ib !=ie;ib++)

???{

???????cout << *ib << endl;

???}

???

???cout <<"----反向迭代---" << endl;

?

???autorb =myset.rbegin();

???autore =myset.rend();

???for (;rb !=re;rb++)

???{

???????cout << *rb << endl;

???}

???//查找

???set<constchar *,strless>::iteratorpfind =myset.find("xyz");

???std::cout << "\n\n\n" << *pfind << endl;

?

???cin.get();

}

運行結果:

2. hash_set

案例1

#include<hash_set>

#include<iostream>

#include<algorithm>

#include<string>

?

usingnamespacestd;

?

voidmain()

{

???hash_set<constchar *>hs;//C++11自帶子字符串的哈希

?

???hs.insert("chian");

???hs.insert("chi123an");

???hs.insert("chi23an");

???hs.insert("chzcian");

???hs.insert("1chzcian");

?

???//這里得到的是一個指針

???autopfind =hs.find("chi23an");

?

???if (pfind == hs.end())

???{

???????std::cout << "沒有";

???}

???else

???{

???????std::cout << *pfind;

???}

???cin.get();

???//運行結果:chi23an

}

案例2

#include<hash_set>

#include<iostream>

#include<algorithm>

#include<string>

?

usingnamespacestd;

?

voidmain()

{

???hash_set<int>hs;

???hs.insert(91);

???hs.insert(21);

???hs.insert(41);

?

???autoib =hs.begin();

???autoie =hs.end();

???for (;ib !=ie;ib++)

???{

???????cout << *ib << endl;

???}

???//查找211

???autopfind =hs.find(211);

???if (pfind == ie)

???{

???????std::cout << "沒有";

???}

???else

???{

???????std::cout << *pfind;

???}

???cin.get();

}

3.multiset(每個元素的節點是一個鏈表)

案例1:multisetset的區別是:multiset允許重復

#include<iostream>

#include<set>

#include<stdio.h>

#include<list>

#include<vector>

#include<algorithm>

#include<functional>

?

usingnamespacestd;

//multisetset的區別是允許重復

voidmain()

{

???multiset<int>myset;?//頭文件set

???myset.insert(11);

???myset.insert(12);

???myset.insert(13);

???myset.insert(10);

???myset.insert(10);

???myset.insert(100);

???autoib =myset.begin();

???autoie =myset.end();

?

???for (;ib !=ie;ib++)

???{

???????std::cout << *ib <<std::endl;

???????printf("%p,%p\n",ib,ib._Ptr);//ib本質是智能指針

???????//建議使用下面的方式打印出外部指針和內部指針

???????printf("%p\n",ib);//ib本質是智能指針

???????//打印內部指針

???????printf("%p\n",ib._Ptr);//ib本質是智能指針

???}

???cin.get();

}

運行結果是:

案例2

#define_CRT_SECURE_NO_WARNINGS

#include<set>

#include<iostream>

#include<string>

?

//multiset每一個節點都是一個鏈表,set每個節點就是一個節點

usingnamespacestd;

?

structstudent

{

???intid;

???charname[30];

};

?

//排序

structstuless

{

???bool operator()(conststudent &s1,conststudent &s2)

???{

???????returns1.id < s2.id;

???}

};

?

voidmain()

{

???studentsarray[3] = { { 10,"tansheng" }, { 3,"liguilong" }, { 4,"xiongfei" } };

???multiset<student,stuless>myset(sarray,sarray + 3,stuless());

???studentstu1;

???stu1.id = 20;

???strcpy(stu1.name,"mouzhiwei");

???myset.insert(stu1);

???strcpy(stu1.name,"mouzhiwei1");

???myset.insert(stu1);

???strcpy(stu1.name,"mouzhiwei2");

???myset.insert(stu1);

???autoib =myset.begin();

???autoie =myset.end();

???for (;ib !=ie;ib++)

???{

???????cout << (*ib).id << "?" << (*ib).name << endl;

???}

?

???cin.get();

}

4.hash_map

案例:

#include<hash_map>//也是紅黑樹,是一個映射

?

#include<iostream>

#include<map>

?

usingnamespacestd;

?

voidmain()

{

???map<int,constchar *>m;

???m.insert(pair<int,constchar *>(201,"司令1"));

???m.insert(pair<int,constchar *>(101,""));

???m.insert(pair<int,constchar *>(401,"司令11111"));

???m.insert(pair<int,constchar *>(301,"司令"));

?

???autoib =m.begin();

???autoie =m.end();

???for (;ib !=ie;ib++)

???{

???????cout << (*ib).first << "??" << (*ib).second << "\n";

???}

???std::cout << "------------" <<std::endl;

???{

???????hash_map<int,constchar *>m;

???????m.insert(pair<int,constchar *>(201,"司令1"));

???????m.insert(pair<int,constchar *>(101,""));

???????m.insert(pair<int,constchar *>(401,"司令11111"));

???????m.insert(pair<int,constchar *>(301,"司令"));

?

???????std::cout << "---正向迭代---" << std::endl;

???????autoib =m.begin();

???????autoie =m.end();

???????for (;ib !=ie;ib++)

???????{

???????????cout << (*ib).first << "??" << (*ib).second << "\n";

???????}

???????autotofind =m.find(1101);

???????if (tofind == ie)

???????{

???????????cout <<"沒有找到";

???????}

???????else

???????{

???????????cout <<"\n\n\n" << (*tofind).first << "?" << (*tofind).second;

???????}

???}

?

???cin.get();

}

運行結果:

5. multimap每一個一個節點是映射的鏈表的開頭

案例1

#include<iostream>

#include<map>

?

usingnamespacestd;

//map,mutlimap區別是map每一個節點是一個映射

//multimap每一個一個節點是映射的鏈表的開頭

voidmain()

{

???map<constchar*,int>m;

???m.insert(pair<constchar *,int>("司令1", 101));

???m.insert(pair<constchar *,int>("司令2", 102));

???m.insert(pair<constchar *,int>("司令3", 103));

???m.insert(pair<constchar *,int>("司令1", 104));

?

???map<constchar *,int>::iteratorib =m.begin();

???autoie =m.end();

???for (;ib !=ie;ib++)

???{

???????cout << (*ib).first << "??" << (*ib).second << "\n";

???}

?

???cin.get();

}

運行結果:

?

?

?

總結

以上是生活随笔為你收集整理的STL之红黑树容器:set,hash_set,multiset,hash_map,multimap的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。