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(6);
//myset.insert(7);重複會被舍棄
autofindpos
=myset.find(10);
cout
<<" find -> " << *findpos
<< " \n";
autoib
=myset.begin();
autoie
=myset.end();
for
(;ib !=ie;ib++)
{
cout
<< *ib <<
" ";
}
<<"\n" <<myset.size()
<< endl;
cin.get();
}
案例2:
structstrless
//二分查找法依賴于有序,字元串有序
bool
operator()(constchar
*str1,constchar
*str2)//二分查找法依賴于有序,字元串有序
returnstrcmp(str1,str2)
< 0;
};
//紅黑樹,處理純數字非常少,經常處理類對象以及字元串
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");
<<"pair start" <<endl;
<< *(p.first)
<< " " <<p.second
<<"pair over" <<endl;
<<"----正向疊代---"
endl;
<<"----反向疊代---"
autorb
=myset.rbegin();
autore
=myset.rend();
(;rb !=re;rb++)
<< *rb <<
//查找
set<constchar
*,strless>::iteratorpfind
=myset.find("xyz");
std::cout
<< "\n\n\n" << *pfind
運作結果:
2. hash_set
案例1:
#include<hash_set>
#include<algorithm>
#include<string>
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
<< *pfind;
//運作結果:chi23an
hash_set<int>hs;
hs.insert(91);
hs.insert(21);
hs.insert(41);
=hs.begin();
=hs.end();
//查找211
=hs.find(211);
ie)
3.multiset(每個元素的節點是一個連結清單)
案例1:multiset與set的差別是:multiset允許重複
#include<stdio.h>
#include<list>
#include<vector>
#include<functional>
//multiset與set的差別是允許重複
multiset<int>myset; //頭檔案set
myset.insert(11);
myset.insert(12);
myset.insert(13);
myset.insert(100);
<< *ib <<std::endl;
printf("%p,%p\n",ib,ib._ptr);//ib本質是智能指針
//建議使用下面的方式列印出外部指針和内部指針
printf("%p\n",ib);//ib本質是智能指針
//列印内部指針
printf("%p\n",ib._ptr);//ib本質是智能指針
運作結果是:
#define_crt_secure_no_warnings
//multiset每一個節點都是一個連結清單,set每個節點就是一個節點
structstudent
intid;
charname[30];
//排序
structstuless
operator()(conststudent
&s1,conststudent
&s2)
returns1.id
< s2.id;
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");
strcpy(stu1.name,"mouzhiwei2");
<< (*ib).id
<< " " << (*ib).name
4.hash_map
案例:
#include<hash_map>//也是紅黑樹,是一個映射
#include<map>
map<int,constchar
*>m;
m.insert(pair<int,constchar
*>(201,"司令1"));
*>(101,"司"));
*>(401,"司令11111"));
*>(301,"司令"));
=m.begin();
=m.end();
<< (*ib).first
<< " " << (*ib).second
<< "\n";
<< "------------" <<std::endl;
hash_map<int,constchar
m.insert(pair<int,constchar
<< "---正向疊代---"
<< std::endl;
autoib
autoie
for
{
cout
}
autotofind
=m.find(1101);
if
(tofind ==
<<"沒有找到";
else
<<"\n\n\n" << (*tofind).first
<< " " << (*tofind).second;
5. multimap每一個一個節點是映射的連結清單的開頭
//map,mutlimap差別是map每一個節點是一個映射
//multimap每一個一個節點是映射的連結清單的開頭
map<constchar*,int>m;
m.insert(pair<constchar
*,int>("司令1",
101));
*,int>("司令2",
102));
*,int>("司令3",
103));
104));
map<constchar
*,int>::iteratorib