天天看點

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

}

STL之紅黑樹容器:set,hash_set,multiset,hash_map,multimap

案例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

運作結果:

STL之紅黑樹容器:set,hash_set,multiset,hash_map,multimap
STL之紅黑樹容器:set,hash_set,multiset,hash_map,multimap

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本質是智能指針

運作結果是:

STL之紅黑樹容器:set,hash_set,multiset,hash_map,multimap

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

STL之紅黑樹容器:set,hash_set,multiset,hash_map,multimap

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

STL之紅黑樹容器:set,hash_set,multiset,hash_map,multimap

繼續閱讀