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

}

运行结果:

 

 

 

时间: 2024-11-03 07:46:47

STL之红黑树容器:set,hash_set,multiset,hash_map,multimap的相关文章

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

C++中 set,multiset,map,multimap 关联容器实例教程

测试环境:windows 7 vs2010 内部元素有序排列,新元素插入的位置取决于它的值,查找速度快. 除了各容器都有的函数外,还支持以下成员函数: find: 查找等于某个值的元素(x小于y和y小于x同时不成立即为相等)lower_bound: 查找某个下界upper_bound: 查找某个上界equal_range: 同时查找上界和下界count:计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等)insert: 用以插入一个元素或一个区间 在学习关联容器之前,我们先要学习pa

c++-侯捷stl源码剖析红黑树代码问题

问题描述 侯捷stl源码剖析红黑树代码问题 在侯捷的stl源码剖析这本书中,P218,红黑树的数据结构代码中有这样一行代码: typedef simple_alloc rb_tree_node_allocator; ,在编译时会报错,其错误为: error: 'simple_alloc' does not name a type 一直没查找到答案,不知道该怎么修改,还请高手解答

STL中的set容器的一点总结

1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.查找等.让用户在STL使用过程中,并不会感到陌生. 关于set,必须说明的是set关联式容器.set作为一个容器也是

红黑树深入剖析及Java实现

红黑树是平衡二叉查找树的一种.为了深入理解红黑树,我们需要从二叉查找树开始讲起. BST 二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小,右节点的值要比父节点的值大.它的高度决定了它的查找效率. 在理想的情况下,二叉查找树增删查改的时间复杂度为O(logN)(其中N为节点数),最坏的情况下为O(N).当它的高度为logN+1时,我们就说二叉查找树是平衡的. BST的查找操作 T  key = a search key  Node ro

数据结构之红黑树

概述 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组.它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees).红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能. 二叉查找树(BST) 二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小,右

深入解析C++ STL中的常用容器_C 语言

STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的常用容器包括:顺序性容器(vector.deque.list).关联容器(map.set).容器适配器(queue.stac). 1.顺序性容器 (1)vectorvector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问.由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢

数据结构之红黑树详解_C 语言

1.简介 红黑树是一种自平衡二叉查找树.它的统计性能要好于平衡二叉树(AVL树),因此,红黑树在很多地方都有应用.在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持).它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除等操作. 本文介绍了红黑树的基本性质和基本操作. 2.红黑树

java中treemap和treeset实现(红黑树)

TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点. TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 TreeSet 之间的关系,下面先看 TreeSet 类的部分源代码: public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializab