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:multiset與set的區別是:multiset允許重復
#include<iostream>
#include<set>
#include<stdio.h>
#include<list>
#include<vector>
#include<algorithm>
#include<functional>
?
usingnamespacestd;
//multiset與set的區別是允許重復
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是红股和红筹股有何区别
- 下一篇: 招商银行信用卡好批吗