天天看点

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

继续阅读